在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. JVM - 如何運行非jit編譯代碼
- 2. jvm次要版本與編譯器次要版本
- 3. 如何從Scala(JVM)運行JavaScript代碼?
- 4. 在新實例中運行JVM或暫停JVM一段時間
- 5. 在JVM上運行基於JNI的.jar
- 6. IntelliJ 2016.3.3(32b)JVM錯誤代碼-6
- 7. 從JVM運行bash腳本
- 8. 在編譯到JVM時
- 9. 企業語言,已編譯或JVM
- 10. 在JVM之上運行/解釋C?
- 11. 如何調試在本機代碼創建的JVM中運行的Java代碼?
- 12. 編譯jvm上的scala程序
- 13. 反編譯JVM語言
- 14. Lua到JVM編譯器?
- 15. 在運行jvm中更改HttpURLConnection
- 16. 在JVM上創建與正在運行的JVM不同的線程
- 17. 熱點JVM是否將代碼編譯爲機器碼或者只是運行它
- 18. 在編譯時檢查iOS10或更低版本
- 19. Scala在JVM上運行了什麼?
- 20. 我的NetBeans運行在哪個JVM上
- 21. 在Ubuntu上運行SOAPUI時JVM崩潰
- 22. android JVM能在PC上運行嗎?
- 23. JVM高速緩存彙編代碼?
- 24. 針對CentOS 5或6的VS代碼版本?
- 25. 用於SCJP準備的JVM規範和Java編譯器代碼?
- 26. JVM JIT編譯器如何優化「重複」Java代碼?
- 27. 有一些準備/默認代碼阻止Internet Explorer 6或更低版本?
- 28. 本地主機上正在運行的JVM的列表
- 29. Java:在使用高版本JDK編譯但在低版本上運行時阻止使用高版本API JRE
- 30. 如何避免jvm容器中運行編譯器線程
JVM不會編譯代碼,但是如果您需要將目標作爲java6並嘗試運行w/jdk1.4,則可能會出現驗證錯誤和/或NoClassDefFounfError等。Java只向後兼容。 – bestsss 2011-02-14 11:12:22