# Check, welche Java Version installiert bevor ein Programm ausgeführt wird.



## piro (20. Sep 2012)

Moin zusammen,

gibt es eine Methode, die die Java Version ausliest, die auf dem Rechner installiert und aktiv ist?

Möchte gerne mein Programm, bevor es startet, überprüfen lassen, ob die richtige Java Version installiert ist, die mein Programm benötigt.

Falls nicht, soll das Programm eine Nachricht ausgeben und das Programm beenden.

Ist sowas möglich?

Vielen Dank im Voraus.
Sven


----------



## Marcinek (20. Sep 2012)

ja,

via System.getProperties();

System (Java 2 Platform SE v1.4.2)


----------



## troll (21. Sep 2012)

also nur mit reinem java wohl eher weniger ... grund : es muss mindestens java in der version drauf sein mit der du compiled hast ...

klar kann man sich einen launcher basteln den man für "1.0" compiled ... bringt aber nichts falls überhaupt kein java aufm system ist ...


lösung : z.b. Launch4J für Windows-EXE-Wrapper bietet die möglichkeit aus der registry auszulesen ob java installiert ist und wenn ja welche version ... falls das erforderliche minimum nicht erfüllt ist wird ein fehler-fenster angezeigt und im standard-browser die download-seite von java.com geöffnet ...

auch gibt es noch ein paar andere launcher ... wie z.b. jsmooth oder jar2exe (! achtung ! kostenpflichtig !) ... aber launch4j ist das bekannteste ...

wie es unter Unix aussieht muss ich leider passen ... aber ich denke das es hierfür bereits irgendwo im netz oder sogar hier in der FAQ in sauberes shell-script geben wird welches eine ähnliches funktion hat ...


----------



## piro (21. Sep 2012)

Moin,

danke schon mal für die Antworten.

Habe jetzt in der Main Methode als 1. mit system.getProperties(); die Java Version abgefragt und geschaut, ob die erforderliche Version drauf ist und wollte dann ggf. das Programm beenden.


```
public static void main(String[] args) {

// Check requirements: only JRE 1.7 or higher is allowed
String jre = System.getProperty("java.specification.version");
double version = Double.valueOf(jre);
	if (version != 1.7) {
		LOG.info("JRE 1.7 is required. Application will be terminated.");
		System.exit(1);
	}
...
}
```

Das Programm stürtz aber schon viel früher ab, d.h. er kommt da gar nicht hin.

Ich werde es wohl mit den Shell-Scripten machen müssen oder kann man auch einen Flag setzen beim erzeugen der JAR Datei, dass diese das selbst überprüft und ggf. es Meldung bringt?

Im Anhang die Fehlermeldung, die auftritt und ich somit gar nicht bis zur JRE Versionsabfrage komme.

Vielen Dank im Voraus.
Sven


----------



## achillesat (21. Sep 2012)

Du könntest dir auch die JAVA Version in einer Batch Datei auslesen und als Variable abspeichern.


----------



## Gast2 (21. Sep 2012)

> Ich werde es wohl mit den Shell-Scripten machen müssen oder kann man auch einen Flag setzen beim erzeugen der JAR Datei, dass diese das selbst überprüft und ggf. es Meldung bringt?


Einige Launcher bieten sowas an, bspw. launch4j. Da wird beim Start die Java Version geprüft und bei Bedarf direkt zum Download verlinkt.


----------



## piro (21. Sep 2012)

kann man das wirklich nicht in die Jar Datei beim Erstellen mit aufnehmen, so dass die Bar-Datei selber den Check macht?


----------



## Ark (21. Sep 2012)

Du musst die Klasse, in der die main-Methode drin ist, mit/für JDK 1.1 kompilieren (Argumente sind -source und -target beim Kompilieren). Dann tritt der gezeigte Fehler nicht mehr auf.

Gegenfrage: Kann man (unter Linux) dafür sorgen, dass eine JVM sich so verhält (zumindest, was die akzeptierten Klassenversionen angeht), als wäre sie eine 1.1er?

Ark


----------



## piro (22. Sep 2012)

Ich habe leider keine Ahnung.

Mir stellt sich nur die Frage, ob das eine gute Idee ist mit dem JDK 1.1 für die Main Klasse. Bin da noch nicht so fit.
Außerdem wüsste ich auch gar nicht wie ich mein Ant Script anpassen sollte, damit nur die Main Klasse ein anderes JDK bekommt und die anderen Klassen das aktuelle. 
Gibt das ein Beispiel, wo die Klassen mit unterschiedlichen JDKs kompiliert werden?

Wie macht ihr denn das, wenn eure Anwendung nur mit einem bestimmten JRE oder höher funktioniert?

Danke im Voraus. 
Sven


----------



## dhalsim (22. Sep 2012)

piro hat gesagt.:


> Wie macht ihr denn das, wenn eure Anwendung nur mit einem bestimmten JRE oder höher funktioniert?


Du könntest auch das JRE mit ausliefern. Beide Vorgehensweisen haben ihre Vor- und Nachteile.


----------



## Ark (22. Sep 2012)

Hier mal ein kleiner Abriss aus einem meiner Ant-Skripte:
[XML]	
	<property name="target" value="1.7" />
	<property name="source" value="1.7" />
	<property name="maintarget" value="1.1" />
	<property name="mainsource" value="1.1" />

[…]

		<javac classpathref="theclasspath"
		       debug="true"
		       debuglevel="${debuglevel}"
		       destdir="${bindir}"
		       excludes="${mainsrcfile}"
		       includeantruntime="false"
		       source="${source}"
		       target="${target}"
		>
			<src path="${srcdir}" />
		</javac>
		<javac classpathref="theclasspath"
		       debug="true"
		       debuglevel="${debuglevel}"
		       destdir="${bindir}"
		       includeantruntime="false"
		       source="${mainsource}"
		       target="${maintarget}"
		>
			<src path="${mainsrcdir}" />
		</javac>
[/XML]
Nicht wahnsinnig sauber, aber es tut. 

Ark


----------



## Guest2 (23. Sep 2012)

Moin,



piro hat gesagt.:


> Wie macht ihr denn das, wenn eure Anwendung nur mit einem bestimmten JRE oder höher funktioniert?



Webstart! Damit lässt sich die notwendige Version exakt festlegen. Außerdem können weitere VM Parameter mit angegeben werden, z.B. der zugewiesene Speicher. Weitere Features wie etwa Auto-Updates oder Dateiverknüpfungen lassen sich ebenfalls ohne zusätzlichen Aufwand nutzen. Und natürlich bleibt alles Plattformunabhängig.

EXE-Wrapper sind höchstens traurig.

Viele Grüße,
Fancy


----------



## Bernd Hohmann (23. Sep 2012)

piro hat gesagt.:


> Das Programm stürtz aber schon viel früher ab, d.h. er kommt da gar nicht hin.



Es scheint so zu sein, dass Deine Klasse com.cat.mak.cgmtiffmanager.Main einen statischen Init hat oder den von einer Oberklasse erbt sodass noch vor dem main(...) inkompatibles Zeug nachgezogen wird.

Sinnvoller wäre aber insgesamt folgender Weg: Du schreibst eine kleine Vorschaltklasse mit der Versionsprüfung, kompilierst das gegen Java "version steinzeit" und packst es in ein eigenes JAR. Aus dieser Vorschaltklasse wird dann das Hauptprogramm in einem separaten JAR File aufgerufen.

Bernd


----------

