2011-02-14 43 views
2

在JVM版本6上執行編譯爲字節代碼的類並在較低版本JVM(如1.4)上執行相同操作的效果如何?在JVM 5或更低版本上運行JVM 6編譯代碼

+0

JVM不會編譯代碼,但是如果您需要將目標作爲java6並嘗試運行w/jdk1.4,則可能會出現驗證錯誤和/或NoClassDefFounfError等。Java只向後兼容。 – bestsss 2011-02-14 11:12:22

回答

4

不確定你在問什麼,但是如果你編譯的Java源文件是針對Java 6的,它將不會在較舊的JVM(比如1.4)上執行。

: ~/tmp > javac -version 
javac 1.6.0_22 
: ~/tmp > javac Test.java 
: ~/tmp > java Test 
Hello World 
: ~/tmp > module add jdk/1.4.2 # switching to Java 1.4.2 
: ~/tmp > java Test 
Exception in thread "main" java.lang.UnsupportedClassVersionError: 
       Test (Unsupported major.minor version 50.0) 
     at java.lang.ClassLoader.defineClass0(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:539) 
     at java.security.SecureClassLoader.defineClass(ClassLoader.java:123) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:55) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:194) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:187) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:289) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:235) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) 
: ~/tmp > 

正如@指出,梅勒但是,你仍然可以使用1.6編譯器來編譯1.4兼容的代碼,通過使用-target選項。不過請記住,這隻適用於不使用任何1.5/1.6特定功能或API類

如果您例如嘗試編譯類似於下面的消息for-each循環,與-target 1.4你會得到的東西:

Test.java:3: ';' expected 
     for (int i : new int[] { 1, 2, 3 }) 
       ^
+0

除非用--target編譯;) – 2011-02-14 11:14:51

+1

你仍然可以使用--target 1.4編譯每個循環,它是--source 1.4,它會引發上面的錯誤。 – jmg 2011-02-14 11:24:01

1

除非與-target命令行選項編譯,也不會在較舊的JVM上運行。

使用-target選項編譯時,編譯後的類應該在較舊的(但不是較老的[目標])jvm上運行100%。

1

如果您嘗試使用爲當前JVM支持的較新JVM編譯的類,則JVM在嘗試加載該類時將拋出UnsupportedClassVersionError。較新的類格式可能具有舊JVM不支持的功能,因此這是必需的。

可以使用javac的-target選項來創建使用較舊的類格式的較新的JDK產品類。但是您仍然需要小心,不要使用僅存在於新JRE中的類或方法 - 否則JVM會在類加載時引發一些錯誤。使用與目標版本相同的JDK版本是最安全的選擇。

P.S. IntelliJ IDEA有一個檢查來警告你是否使用了太新的方法/類。還有一個名爲Retroweaver的工具在Java 1.4上運行Java 5代碼。