我正在使用Java 11处理一些依赖项并编译到较早的发行版。我将一个依赖项迁移到Java 11并可以正常工作,但是我们仍然必须在Java8上运行它Tomcat 7或8。是否可以使用--release
标志来编译使用var
,stream().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]
答案 0 :(得分:9)
不可能。仅允许目标Java平台的API方法和类。
中定义定义了新的命令行选项--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)