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

agi*_*lob 15 java maven

我正在使用java 11使用一些依赖项和编译到旧版本.我将一个依赖项迁移到Java 11并且工作正常,但我们仍然必须在Java8上运行Tomcat 7或8.是否有可能使用--release标志来编译它使用的代码var,stream().dropwhile(...)Map.of(...)和8上运行?

发布标志表明它应该是可能的:

--release release针对特定VM版本的公共,支持和记录的API进行编译.支持的发布目标是6,7,8和9.

这个项目是一个依赖项,独立于SprinBoot2.1和Java11可以正常工作,但需要在Java8中运行.

我的maven插件编译器设置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>8</release>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

但是这禁止编译> jdk8特定代码.我正在使用上面最新的maven 3.6.0和mvn编译器.

尝试编译:

return List.of("dsadas", "dasdadddds", "£dsada", "dasdas")
        .stream()
        .dropWhile(s -> s.contains("das"))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

抛出错误:

[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]
Run Code Online (Sandbox Code Playgroud)

lal*_*alo 10

这不可能.仅允许目标Java平台的API方法和类.

这是在JEP 247:为旧版平台版本编译中定义的

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

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

对于N <9,记录的API由javac的JDK N的默认bootclasspath上的公共API组成.

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


agi*_*lob 5

现在可以使用https://github.com/bsideup/jabel

Jabel - javac 12 插件,使其发出 Java 8 字节码