# Abfrage ob JRE oder JDK auf System installiert ist.



## KJay (29. Jun 2007)

Hallo!

Ich habe folgendes Problem:

Mein Programm was ich geschrieben haben muß zwingend auf einem Java JSK VErsion 6 oder höher ausgeführt werden.  Nun versuche ich schon in der main über System.getProperty() abzufragen ob die Version okay ist und ob ein das Programm auf einem JDK ausgeführt wird... 

Die Versionsabfrage mach ich so:


```
System.getProperty("java.specification.version")
```

Aber wie kann man denn abfragen on eine JRE oder ein JDK läuft? 

Danke schonmal für die Hilfe!

Gruß,
Kai

PS: Wichtig ist das ein JDK läuft, weil zur Laufzeit compiliert wird..... Deswegen kann das Programm nicht auf einem JRE ausgeführt werden, da meines WIssens nach auf einem JRE nicht compiliert werden kann....oder?


----------



## Campino (29. Jun 2007)

Jop, auf einem JRE kann nicht kompiliert werden. 

Wenn du über System.getRuntim().exec() den Kommandozeilenbefehl javac -version ausführst, erhälst du einen Process, in dessen InputStream die Version steht. Darin musst du nach der versionsnummer suchen. Guck dir die Ausgabe am besten mal in der Konsole an. Wenn kein JDK vorhanden ist, kommt unter Windoof "Der Befehl "javac" ist entweder falsch geschrieben oder konnte nicht gefunden werden. "
Die Ausgabe sollte sich in jedem betriebssystem weit genug unterscheiden, damit keine Verwechslungsgefahr besteht.


----------



## KJay (29. Jun 2007)

Danke schonmal für die Antwort.

Leider funktioniert das bei mir nicht. Ich habe ein JDK installiert - aber bekomme trotzdem unter der WIndows-Eingabeaufforderung die Fehlermeldung. Woran kann das liegen?

Gruß,
Kai

PS: Kann es sein das Du als Java Befehl Runtime.getRuntime().exec("javac -version") meintest?


----------



## Murray (29. Jun 2007)

Man könnte versuchen, per Class#forName eine Klasse zu laden, die beim JDK dabei ist, aber nicht in der JRE (z.B. com.sun.tools.javac.Main). Ganz sauber ist das nicht, da die com.sun.*-Klassen nur beim SUN-JDK dabei sind und auch nicht notwendigerweise in zukünftigen JDKs unter dem gleichen Namen ehthalten sein werden, aber vielleiht reicht es für deinen Anwendungsfall.


----------



## KJay (30. Jun 2007)

Danke! Leider reicht das nicht aus... Wäre wirklich wichtig, das ich das sauber auslesen kann.... ABer danke für deine Antwort!


----------



## Murray (30. Jun 2007)

Ich fürchte, das wird 100% sauber (  = zukunftssicher & plattformunabhängig ) nicht möglich sein - entweder sucht man nach einer bestimmten Datei im lokalen Dateisystem, oder man lässt Java eine bestimmte Klasse suchen; in beiden Fällen ist man von gwissen "Non-Standard-"Eigenschaften abhängig.

Aber du willst ja zur Laufzeit Kassen übersetzen - wie soll das denn passieren?  Vermutlich sind dadurch bereits die Randbedingungen definiert


----------



## KJay (30. Jun 2007)

Also, ab VErsion 6 von Java gibt es einen Compiler: Ich habe das so realisiert:

public class ObjectFactoryCompiler {
	public ObjectFactoryCompiler() {
		File datei = new File("." + File.separator + "generated" + File.separator + "ObjectFactory.java");
		if (!datei.canRead()) {
			new ErrorDisplay("Error while compiling", "Maybe one of the following errors happend\n\n"
					+ "- the ObjectFactory wasn´t generated\n"
					+ "- You are running the application on a JRE instead of JDK\n");
		}
		Tool javac = ToolProvider.getSystemJavaCompiler();
		javac.run(null, null, null, datei.getAbsolutePath().toString());
	}

Jetzt ist eben das Problem, das mein Programm bis zu dieser Klasse auf einem JRE ausgeführt werden kann. Wenn es aber zum Aufruf dieser Klasse kommt unter einem JRE, dann geht das natürlich nicht mehr....deswegen ist es wichtig das ich vorher abfrage ob das Prog auf einem JDk läuft..

Gruß,
Kai


----------



## Murray (30. Jun 2007)

Nun, dann könntest du doch einfach beim Programmstart versuchen, einen Compiler zu erzeugen (oder einfach nur die entsprechende Klasse zu laden wie in meinen ersten Vorschlag - nur eben mit der "offiziellen" Compilerklasse). Wenn dabei eine Exception auftritt, war der Compiler offenbar nicht verfügbar, und man arbeitet mit einer JRE oder einem zu alten JDK. Die Exception musst du einfach nur sauber abfangen und dem Benutzer einen entsprechenden Hinweise geben.


----------



## KJay (30. Jun 2007)

DARAUF bin ich noch gar nicht gekommen. Das klingt nicht so schlecht - das stellt einerseits sicher das JDK 6+x ausgeführt wird weils den Compiler ja erst ab 6 gibt und andererseits gibts den nur auf dem JDK.... DAs hört sich doch schonmal nach einem  guten workarround an....das versuche ich mal! VIELEN DANK erstmal! Du hast mir einen klasse Ansatz geliefert!


----------



## KJay (30. Jun 2007)

mm...ich weiss nicht wie ich das hinbekommen kann - hast Du mal einen Tipp wie man das macht?

Ich habe das so versucht:


```
if (ToolProvider.getSystemJavaCompiler().getClass().toString() != null ) {
		//starte Progra,,
		} else {
		  fehler behandeln
                                    }
```

klappt nicht - gibt eine nullpointer wenn das auf dem JRE läuft....

Wie kann ich die denn abfangen? (try-catch ist klar - aber wie genau die nullpointer....?)

Gruß,
Kai[/code]


----------



## Murray (30. Jun 2007)

Die NullPointerException könntest abfangen wie jede andere Exception auch, also

```
try {
  /* ... */
} catch ( NullPointerException npe) {
  /* Fehlerbehandlung */
}
```

aber in diesem Fall ist es ja viel leichter: ToolProvider#getSystemJavaCompiler liefert ja null zurück, wenn es keinen Compiler gibt.

Also:

```
if (ToolProvider.getSystemJavaCompiler()!= null ) {
      //starte Programm
} else {
      // Fehler behandeln 
}
```


----------



## KJay (2. Jul 2007)

Mmmmm....ich bin etwas überfragt.....wenn ich das ganze jetzt unter Eclipse laufen lasse dann funktioniert das Prima. Wenn ich mein Programm nun als .JAR file exportiere und dann auf dem JDK ausführe, springt die Fehlerbehandlung an...... Woran könnte das liegen?

Gruß,
Kai

PS: Ich habe Windows Vista und sowohl JRE als  auch JDK installiert. Im Java Panel in der Systemsteuerung habe ich dann um die .JAR auszuführen das JRE deaktiviert. Ist das eventuell nicht genug?


----------



## Gast (2. Jul 2007)

musste unter vista jre6.0 komplett rausschmeissen, damit er mir jdk5.0 nimmt. kannst das jre verzeichnis ja einfach mal umbenennen und dann JAVA_HOME aufs jdk verzeichnis setzen


----------

