编程语言
首页 > 编程语言> > 如何在Java 11中生成代码,但目标是Java 8及更高版本?

如何在Java 11中生成代码,但目标是Java 8及更高版本?

作者:互联网

参见英文答案 > Move to OpenJDK-11 but compile in Java 8                                    2个
>            Can Java 8 code be compiled to run on Java 7 JVM?                                    5个
我正在开发一个小型库,出于显而易见的原因,我想使用所有Java 11功能(我现在想的模块除外)生成代码,但我希望该库与Java 8及更高版本兼容.

当我尝试

javac -source 11 -target 1.8 App.java

我收到了消息

warning: source release 11 requires target release 11

当我看到字节代码时,我看到该类的版本是0x37(Java 11):

$xxd App.class
00000000: cafe babe 0000 0037 ...

Java 8无法加载它:

Exception in thread "main" java.lang.UnsupportedClassVersionError: App has been
    compiled by a more recent version of the Java Runtime (class file version 55.0),
    this version of the Java Runtime only recognizes class file versions up to 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

人们如何提供这种兼容性?我对所有构建工具持开放态度.

对我来说,将高级语言(java)转换为低级(字节码)似乎很容易.在我看来,当高级语言发生变化时,低级语言应该保持不变.这就是为什么我认为这是可能的.

UPDATE

大家好,我不认为这个答案与Move to OpenJDK-11 but compile in Java 8重复,因为OP询问如何继续使用Java 8功能生成代码,但是目标Java 11(这只是一个着名的向后兼容性).我的问题是另一种方式:我想在Java 11中生成代码,但是以Java 8为目标.当我在提出问题之前研究这个主题时,我遇到了这个问题.我觉得它不适用于我的情况.

另一个问题Can Java 8 code be compiled to run on Java 7 JVM看起来与我的问题类似,但它在2013年被问到,字节码在Java 7和Java 8之间明显改变.

我不认为字节码变化那么多,因为Java 8就是我问这个问题的原因.

解决方法:

虽然我没有在javac的javadoc中看到任何明确的内容,但我认为你只能为-source和-target选项声明相同的版本. Java 8中不支持Java 11功能,但事实恰恰相反,更高版本的Java版本可以运行在较低版本中编译的代码.因此,我认为编写编写到Java 11的代码不可能在Java 8中运行.

标签:java-11,java,javac,cross-compiling
来源: https://codeday.me/bug/20190726/1548873.html