在JVM版本6上執行編譯爲字節代碼的類並在較低版本JVM(如1.4)上執行相同操作的效果如何?在JVM 5或更低版本上運行JVM 6編譯代碼
回答
不確定你在問什麼,但是如果你編譯的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 })
^
除非用--target編譯;) – 2011-02-14 11:14:51
你仍然可以使用--target 1.4編譯每個循環,它是--source 1.4,它會引發上面的錯誤。 – jmg 2011-02-14 11:24:01
除非與-target命令行選項編譯,也不會在較舊的JVM上運行。
使用-target選項編譯時,編譯後的類應該在較舊的(但不是較老的[目標])jvm上運行100%。
如果您嘗試使用爲當前JVM支持的較新JVM編譯的類,則JVM在嘗試加載該類時將拋出UnsupportedClassVersionError
。較新的類格式可能具有舊JVM不支持的功能,因此這是必需的。
可以使用javac的-target
選項來創建使用較舊的類格式的較新的JDK產品類。但是您仍然需要小心,不要使用僅存在於新JRE中的類或方法 - 否則JVM會在類加載時引發一些錯誤。使用與目標版本相同的JDK版本是最安全的選擇。
P.S. IntelliJ IDEA有一個檢查來警告你是否使用了太新的方法/類。還有一個名爲Retroweaver的工具在Java 1.4上運行Java 5代碼。
- 1. 更改MATLAB編譯運行時jvm版本
- 2. JVM - 如何運行非jit編譯代碼
- 3. 將kotlin代碼編譯爲JVM和JavaScript
- 4. 可以在JVM 8上運行使用JDK 7編譯的scala代碼嗎?
- 5. 在OpenJDK JVM上運行cachegrind
- 6. 在運行時更改JVM JIT選項
- 7. jvm次要版本與編譯器次要版本
- 8. 在1.6 JVM上運行的Jetty無法運行在Java 1.6上編譯的webapp
- 9. JVM編譯類文件到彙編源代碼或二進制代碼
- 10. 從C代碼運行64位JVM
- 11. 如何從Scala(JVM)運行JavaScript代碼?
- 12. 在新實例中運行JVM或暫停JVM一段時間
- 13. 在JVM上運行基於JNI的.jar
- 14. IntelliJ 2016.3.3(32b)JVM錯誤代碼-6
- 15. 從JVM運行bash腳本
- 16. 在編譯到JVM時
- 17. 如何將JVM彙編代碼編譯爲字節碼?
- 18. 更改JVM版本建立在Drone.io
- 19. Qt OS 10.6 build不在OS 10.5或更低版本上運行
- 20. 企業語言,已編譯或JVM
- 21. 在JVM之上運行/解釋C?
- 22. 如何調試在本機代碼創建的JVM中運行的Java代碼?
- 23. 反編譯JVM語言
- 24. GWT編譯崩潰JVM
- 25. Lua到JVM編譯器?
- 26. 編譯jvm上的scala程序
- 27. 在運行jvm中更改HttpURLConnection
- 28. 在JVM上創建與正在運行的JVM不同的線程
- 29. 如何更改Tomcats JVM版本?
- 30. 熱點JVM是否將代碼編譯爲機器碼或者只是運行它
JVM不會編譯代碼,但是如果您需要將目標作爲java6並嘗試運行w/jdk1.4,則可能會出現驗證錯誤和/或NoClassDefFounfError等。Java只向後兼容。 – bestsss 2011-02-14 11:12:22