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

时间:2018-11-15 17:57:56

标签: java maven

我正在使用Java 11处理一些依赖项并编译到较早的发行版。我将一个依赖项迁移到Java 11并可以正常工作,但是我们仍然必须在Java8上运行它Tomcat 7或8。是否可以使用--release标志来编译使用varstream().dropwhile(...)Map.of(...)并在8上运行的代码?

发布标志表明应该可行:

  

-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>

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

尝试编译:

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

抛出错误:

[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]

3 个答案:

答案 0 :(得分:9)

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

tried

中定义
  

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

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

  

对于N <9,已记录的API由JDK N的javac默认引导类路径上的公共API组成。

     

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

答案 1 :(得分:2)

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

  

Jabel-使它发出Java 8字节码的javac 12插件

答案 2 :(得分:-1)

用于想法使用

enter image description here

对我有用