2013-06-27 13 views
6

Mam plik jar skompilowany przy użyciu jdk 1.7, Chciałbym sprawdzić podczas ładowania, że ​​środowisko uruchomieniowe java, pod którego działa jar jest 1.7 lub nowszy. Czy jest jakiś sposób na zrobienie tego?Sprawdzanie zgodności wersji java

Próbowałem użyć System.getProperty ("java.version"), ale to nie pomogło, ponieważ moja wersja klasy była 51 i 1.6 odmówić jej załadowania.

+6

Jak już zaobserwować można uruchomić to tylko 1,7 lub wyższym. Możesz uruchomić słoik skompilowany dla wersji 1.6 z 1.7, ale nie na odwrót. Stąd twój czek jest zbędny. – Ingo

+2

Aby uzyskać więcej informacji na temat 1.7 i kompatybilności sprawdź http://www.oracle.com/technetwork/java/javase/compatibility-417013.html –

Odpowiedz

6

Niestety, jeśli jest skompilowany na wersji 1.7, nie będzie działał na starszym ... więc żaden kod, który dodasz, nie zostanie uruchomiony (smutna twarz). Możesz skompilować go ze starszą wersją, używając flagi -target 1.6. Ale z twojego posta wynika, że ​​potrzebujesz funkcji 1.7. Być może więc mógłbyś napisać aplikację "opakowującą", która została skompilowana ze starą wersją Javy, sprawdził, a następnie załadował i uruchomił twój słoik - a może mógłbyś osiągnąć to samo, używając jakiegoś skryptu.

Zobacz także this question.

7

Mam ten sam wymóg i rozwiązać go w następujący sposób:

posiadają klasę „Uruchomienie”, że nie ma żadnej zależności (= importu) do każdej nowej klasy JDK lub na którykolwiek z klas swojej aplikacji. Ty człowiek nie zaimportuj swoją główną klasę po imieniu!

Coś jak:

Wewnątrz tej klasy rozrusznika, należy sprawdzić wersję Java, które potrzebujesz.

Jeśli kontrola się powiedzie, załaduj swoją główną klasę za pomocą refleksji i rozpocznij jej główną metodę (lub dowolną metodę, której używasz). Coś takiego:

public class MyStarter 
{ 
    public static void main(String[] args) 
    { 
     String version = System.getProperty("java.version", null); 
     boolean isVersionOK = ... ; 

     if (!isVersionOK) 
     { 
     System.err.println("Wrong Java version detected"); 
     // or display some messagebox using JOptionPane 
     System.exit(1); 
     } 

     Class mainClass = Class.forName("com.foo.MyMain"); 
     Method main = mgr.getDeclaredMethod("main", new Class[] { String[].class }); 
     main.invoke(null, new Object[] { args }); 
    } 
} 

Znowu: upewnić MyStarter nie zawiera żadnychimportu do aplikacji lub klas, które nie są dostępne w języku Java 1.2 (lub cokolwiek Java wersja będzie kierować).

Następnie skompilować MyStarter (i tylko że klasa) z -source 1.2 -target 1.2 Kompilacja resztę swoich klasach z regularną kompilator (np tworzenia plików Java7 .class).

Jeśli wygenerujesz plik wykonywalny, a następnie dodaj com.foo.MyStarter jako atrybut Main-Class:.

My z "kompilacji" target w moim Ant build.xml wygląda mniej więcej tak:

 
<-- compile the starter class for Java 1.2 --> 
<javac destdir="${build}" 
     srcdir="${src}" 
     target="1.2" 
     source="1.2" 
     encoding="ISO-8859-1" 
     includeantruntime="false" 
     includes="com/foo/MyStarter.java"/> 

<-- compile the rest with for Java 1.6 --> 
<javac destdir="${build}" 
     srcdir="${src}" 
     target="1.6" 
     source="1.6" 
     includeantruntime="false" 
     encoding="ISO-8859-1"> 
    <exclude name="com/foo/MyStarter.java"/> 
    <classpath> 
     .... 
    </classpath> 
</javac> 

następnie umieścić wszystko w jednym pliku jar.

+0

Nice - to właśnie miałem na myśli przez wrapper aplikacji :) – selig

0

Rozważ rozmieszczenie oprogramowania przy użyciu technologii Java Web Start. Następnie możesz określić w pliku jnlp dokładną wersję java obsługiwaną przez twoją aplikację.

W szczególności minimalna wersja Java jest zadeklarowana w elemencie j2se.

Na przykład:

<?xml version="1.0" encoding="UTF-8"?> 
<jnlp spec="1.0+" codebase="" href=""> 
    <information> 
     <title>Dynamic Tree Demo</title> 
     <vendor>Dynamic Team</vendor> 
     <icon href="sometree-icon.jpg"/> 
     <offline-allowed/> 
    </information> 
    <resources> 
     <!-- Application Resources --> 
     <j2se version="1.6+" href= 
      "http://java.sun.com/products/autodl/j2se"/> 
     <jar href="DynamicTreeDemo.jar" 
      main="true" /> 

    </resources> 
    <application-desc 
     name="Dynamic Tree Demo Application" 
     main-class="webstartComponentArch.DynamicTreeApplication" 
     width="300" 
     height="300"> 
    </application-desc> 
    <update check="background"/> 
</jnlp> 

See this link for more information

Powiązane problemy