簡體   English   中英

在JVM 5或更低版本上運行JVM 6編譯代碼

[英]Running JVM 6 compiled code on JVM 5 or lower

在JVM版本6上執行編譯為字節碼的類並在較低版本的JVM(例如1.4)上執行相同的類有什么作用?

不確定您真正要問的是什么,但是如果編譯針對Java 6的Java源文件,它將不會在較早的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 > 

但是,正如@ The-MeLLeR所指出的那樣,通過使用-target選項,您仍然可以使用1.6編譯器來編譯為1.4兼容代碼。 但是請記住,這僅在不使用任何1.5 / 1.6特定功能或API類的情況下才有效

例如,如果嘗試使用-target 1.4編譯for-each循環,則將獲得類似於以下消息的內容:

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

除非使用-target命令行選項進行編譯,否則它將無法在較早的JVM上運行。

使用-target選項進行編譯時,已編譯的類應在較舊(但不比[target]較早)的jvm上運行100%相等。

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

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

如果您使用的方法或類太新,PS IntelliJ IDEA會發出警告。 還有一個名為Retroweaver的工具可以在Java 1.4上運行Java 5代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM