我在 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/