2013-06-18 9 views
8

Kurze Frage: Wenn ich relativ "kleine" Java 7 Sprachfeatures verwende, die vorher in Java 6 nicht verfügbar waren, wie der try-muticatch Block ... bedeutet dies, dass mein Programm nicht auf Computern läuft mit JRE 6 oder JRE 5 nach der Kompilierung installiert? Wenn das korrekt ist, gibt es eine schnelle Möglichkeit, eine ausführbare JRE6-JAR-Datei zu erstellen, ohne einen Java 7-Quellcode zu ändern (was übrigens das einzige Java 7-Feature ist, das es verwenden würde, ist der Try-Multicatch-Block)?Java 7 Sprache Rückwärtskompatibilität

Antwort

8

Sie haben Recht. Multi-Catch ist ein Java 7-Sprachfeature und es gibt keine Möglichkeit, es zu Java 6 (oder früherem) JVM-kompatiblem Bytecode zu kompilieren.

eine Java-7-Compiler ermöglicht die folgenden Java 6 kompatibel Bytecode kompiliert:

javac -source 1.6 -target 1.6 MyJavaFile.java

Wenn Sie (zB Multi-catch,) eine Java-7-Sprache-Funktion zu kompilieren versuchen, werden Sie erhalten:

roach$ javac -source 1.6 -target 1.6 test.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
test.java:9: error: multi-catch statement is not supported in -source 1.6 
    } catch (NullPointerException | BufferOverflowException ex) {} 
           ^
    (use -source 7 or higher to enable multi-catch statement) 
1 error 
1 warning 

(weitere Informationen über das, was die warning Mittel, siehe: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - es ist nicht relavent zu dieser Diskussion)

012.351.

Wenn Sie die -source Flagge 1.7 ändern erhalten Sie:

source release 1.7 requires target release 1.7

Weil ... Sie Java 7 Quelle nicht kompilieren können (z Quelle, die Java 7-Funktionen hat) mit Java 6 kompatiblem Bytecode.

Wenn Sie es mit Java 7 kompilieren (ohne -source oder -target Flag), erhalten Sie Java 7 Bytecode, der nicht auf einer Java 7 JVM < ausgeführt werden kann. Und wenn Sie dies versuchen, erhalten Sie eine Fehlermeldung, dass die Versionen nicht übereinstimmen:

roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : Unsupported major.minor version 51.0

7

Sie kann nicht Quelle kompilieren mit Java 7-Funktionen in Java 6 .class- weil diese

javac -source 1.7 -target 1.6 Test.java 

source release 1.7 requires target release 1.7 Fehler produziert. Dies liegt daran, dass einige der Features von 1.7 nur mit Java 7-Klassen funktionieren können. ZB try-with-resources verwendet Throwable.addSuppressed Methode nur verfügbar seit 1.7