【问题标题】:exec-maven-plugin Java version different from maven-compiler-plugin Java version in NetBeans projectexec-maven-plugin Java 版本与 NetBeans 项目中的 maven-compiler-plugin Java 版本不同
【发布时间】:2020-07-16 05:10:05
【问题描述】:

我使用低于 IDE 使用的系统环境 JAVA_HOME (1.8) (14) 启动 NetBeans IDE 12.0。 Maven 执行的 IDE 输出窗口似乎显示该项目是使用 JAVA_HOME for JDK 14 运行的,以这种方式运行项目文件。

但是 exec-maven-plugin 失败并显示 java.lang.UnsupportedClassVersionError: com/mycompany/Start has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

这似乎表明 Maven 在 IDE 中运行在 1.8 下,忽略了 IDE 自己的 JAVA_HOME 覆盖设置 14。它使用 JAVA_HOME 中设置的 JDK,因为如果我在 IDE 启动之前将 JAVA_HOME 设置为 14.0,那么它可以工作。

我正在寻找正确的方法,正确的位置,专门为任何项目设置 JDK,无论 IDE 启动时激活的 JAVA_HOME 设置如何。

我的案例可以通过运行安装了 JDK 14.0 但 JAVA_HOME 设置为 1.8 的 IDE 12.0 来重现。在 IDE 启动之前。我使用从https://wicket.apache.org/start/quickstart.html 的命令生成的 Maven 项目 - 全部设置为默认值。要运行的文件是 Start.java。

这对我很重要,因为我必须使用不同的 JDK 打开许多不同的项目,因此每次使用不同的 JAVA_HOME 设置重新启动 IDE 是不切实际的。事实上,我的设置似乎定义不明确 - 我一定遗漏了一些东西。

我应该在项目属性中添加,我已按预期将 Build|Compile|Java Platform 设置为 JDK 14(默认)。

我已经提交了NetBeans Issue

【问题讨论】:

    标签: java maven netbeans


    【解决方案1】:

    对于 maven,如果您希望项目的字节码为 1.8,请尝试仅设置编译器插件使用的变量,即使您使用的是较新的 JDK。

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

    https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

    如果您想要完全不同的 java 安装,那么您可能需要查看工具链。但是,如果上述方法不能满足您的需求,我只会走这条路。 https://maven.apache.org/guides/mini/guide-using-toolchains.html

    我不熟悉 NetBeans,但希望它能读取 maven 的编译器级别。

    【讨论】:

    • 不幸的是,这个答案不适用于这个问题。我需要编译器按照 IDE 项目设置中的设置为 Java 14 进行编译,而编译器实际上是这样做的。问题是 exec-maven-plugin 在 JDK 1.8 下运行 JDK 14 编译的字节码,即使 IDE 似乎用 JDK 14 的路径覆盖了 JAVA_HOME,这是令人困惑的部分。要查看发生了什么,确实需要将 NetBeans 与所描述的项目一起使用,这很容易做到。