是否可以将Java11代码编译成Java8字节码并在8上运行?

是否可以将Java11代码编译成Java8字节码并在8上运行?,java,maven,Java,Maven,我正在使用Java11处理一些依赖项和对旧版本的编译。我将一个依赖项迁移到Java11,工作正常,但我们仍然必须在Java8上运行Tomcat7或8。是否可以使用--release标志编译使用var、stream().dropwhile(…)或Map.of(…)并在8上运行的代码 释放标志表明应该可以: --该版本针对特定VM版本的公共、受支持和有文档记录的API进行编译。支持的发布目标 分别是6、7、8和9 这个项目是一个依赖项,单独使用SprinBoot2.1和Java11可以很好地工作,但

我正在使用Java11处理一些依赖项和对旧版本的编译。我将一个依赖项迁移到Java11,工作正常,但我们仍然必须在Java8上运行Tomcat7或8。是否可以使用
--release
标志编译使用
var
stream().dropwhile(…)
Map.of(…)
并在8上运行的代码

释放标志表明应该可以:

--该版本针对特定VM版本的公共、受支持和有文档记录的API进行编译。支持的发布目标 分别是6、7、8和9

这个项目是一个依赖项,单独使用SprinBoot2.1和Java11可以很好地工作,但需要在Java8中运行

My maven插件编译器设置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>8</release>
    </configuration>
</plugin>
抛出错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project api: Compilation failure: Compilation failure: 
[ERROR] /home/agilob/Projects/.....java:[58,13] cannot find symbol
[ERROR]   symbol:   class var
[ERROR]   location: 
[ERROR] /home/agilob/Projects/....java:[43,20] cannot find symbol
[ERROR]   symbol:   method of(java.lang.String,java.lang.String,java.lang.String,java.lang.String)
[ERROR]   location: interface java.util.List
[ERROR] -> [Help 1]

这是不可能的。只允许目标Java平台的API方法和类

这是在

定义了一个新的命令行选项-release,它会自动 将编译器配置为生成将链接到的类文件 给定平台版本的实现

说明可使用内容的相关部分是:

对于N<9,文档化的API由公共API组成,这些API位于JDKN的javac默认引导类路径上

对于N>=9,文档化的API包括(i)从JDK映像中的模块导出的API,这些模块是JDK N文档的一部分;(ii)从jdk.unsupported模块导出的API(记录在JEP 260中)

现在有可能了

Jabel-JavaC12插件,使其发出Java8字节码

供创意使用


它对我有效

问题的一部分似乎是在Java 9中添加了静态工厂,因此在8的运行库中不存在。另外,Java 9中添加了Java.base.Stream的方法dropWhile,因此它不是受支持的API的一部分。看到了吗?是的,var是在Java10中添加的,但由于这些是对语言的编译时修饰性更改,它们不能静态链接并捆绑在.class和.jar中吗?@agilob理论上是的。实际上,我不知道有哪种工具能做到这一点。如果你找到了,请告诉我。请参阅答案指南。您应该引用并链接到相关文档,并提供代码示例。任何附件/截图都应直接添加到答案中@kapad仅适用于OP可以嵌入屏幕截图/附件的情况;)(在中编辑-他们链接到imgur图像)是否嵌入赢得的特权?我相信系统不允许您以1的声誉添加图像,是的。链接,是的。嵌入否。我必须再次测试。这不是问题所在。这是不可能的,因为Java 8运行时库中不存在
dropWhile()
Map.of()
方法。Jabel将允许使用
var
,但这并不能回答这个问题。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project api: Compilation failure: Compilation failure: 
[ERROR] /home/agilob/Projects/.....java:[58,13] cannot find symbol
[ERROR]   symbol:   class var
[ERROR]   location: 
[ERROR] /home/agilob/Projects/....java:[43,20] cannot find symbol
[ERROR]   symbol:   method of(java.lang.String,java.lang.String,java.lang.String,java.lang.String)
[ERROR]   location: interface java.util.List
[ERROR] -> [Help 1]