java - java 9中引入的方法是使用编译器目标java 8编译的

标签 java maven java-11

我在 Maven 以及 Eclipse 本身中遇到了奇怪的行为。 即使我将项目配置为在 Java 1.8 中编译,我也可以编译并运行 (eclipse) Java 9 中引入的一段代码

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

有问题的代码行:

LocalTime.ofInstant(cal.toInstant(), cal.getTimeZone().toZoneId());

我在本地使用Oracle的JDK 11进行编译并在eclipse中运行,没有任何错误。当我使用 openjdk:8-jdk-alpine 将其打包到 docker 容器中时,它将启动,但在调用该方法时抛出以下异常:

java.lang.NoSuchMethodError: java.time.LocalTime.ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/LocalTime

在进行测试之前,我如何避免和识别这些情况?我是否做错了什么,或者是构建系统或 JDK11 中的错误?

提前致谢

最佳答案

source 选项指定源代码必须与 Java 8 兼容,target 选项指定类应与 Java 8 兼容。但是,如果您使用 Java 11 构建并且那么你可能会得到像你所遇到的错误。

有两个很好的解决方案。一种是使用 Maven 工具链插件并使用 Java 8 进行构建。然后您可以安装多个 Java 版本,Maven 将在每个项目的基础上使用配置的版本。

另一种是使用新的release和testRelease选项。他们将使用给定版本中的 API 类进行构建。只需添加 <release>1.8</release> .

关于java - java 9中引入的方法是使用编译器目标java 8编译的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61075082/

相关文章:

java - 2 次非法注解异常

java - AES java编码,ruby解码

java - javafx 中的可滚动网格 Pane

java - 通过maven更改静态字段值

JavaFX:位置未设置

java - AndEngine - 滚动 map 时的 Artifact (TextureOptions 相关)

maven - Ubuntu maven JAVA_HOME 环境变量定义不正确

java - 我如何找出哪些元素用作 cssQuery 的参数

java - 如何更改install4j 7.0.11 IDE的jdk?

java - ForkJoinPool 性能 Java 8 对比 11