Java 警告:[选项] 系统模块路径未与 -source 11 一起设置

Web*_*Inc 7 java warnings netbeans compilation path

这台机器安装了多个版本的 Java JDK 和多个 IDE 的多个版本(Netbeans、IntelliJ、Eclipse 等)。最近,我添加了 JDK 15.0.2 和 Netbeans 12.2。当尝试编译一个简单的“Hello World”时,结果如下:

ant -f C:\\Data\\NetBeans\\grading\\TestGrading -Dnb.internal.action.name=run.single -Djavac.includes=testgrading/HelloWorld.java -Drun.class=HelloWorld run-single

init:

Deleting: C:\Data\NetBeans\grading\TestGrading\build\built-jar.properties

deps-jar:

Updating property file: C:\Data\NetBeans\grading\TestGrading\build\built-jar.properties

Compiling 1 source file to C:\Data\NetBeans\grading\TestGrading\build\classes

**warning: [options] system modules path not set in conjunction with -source 11**

**1 warning**

compile-single:

run-single:

Hello World!

BUILD SUCCESSFUL (total time: 1 second)
Run Code Online (Sandbox Code Playgroud)

如您所见,该文件已编译并运行,但警告引起了我的担忧。我在搜索中找不到类似的警告...(所有警告均指“未设置引导类路径”而不是“未设置系统模块路径”

我已更新我的环境变量以反映最新的 JDK,其中包含以下条目:JAVA_HOME=C:\Program Files\Java\jdk-15.0.2

当我更新 JDK 和 IDE 时,我缺少哪些未正确更新的设置?或者我完全找错地方了?或者我是否需要完全卸载以前的版本,如果是这样,这会对使用我仍想保留的以前版本编写的以前的代码产生什么影响?

提前致谢!

Web*_*Inc 7

我偶然发现了这个问题并解决了!虽然新安装更改了库属性中的 Java 平台,以正确指向 JDK 15 作为新版本(默认),但在源区域​​底部,源/二进制格式仍然显示 JDK 11。手动将其更改为JDK 15 使警告消失了。警告消息应该说明“源/二进制格式”与 Library Java Platform 不匹配 - 检查相应版本。

  • 我花了一点努力来理解您的解决方案(有效 - 谢谢!),所以为了向其他人澄清:在 Netbeans 中,右键单击项目并转到“属性”。然后看来源。如上所述,源/二进制格式将指定旧版本的 JDK,因此请使用下拉列表更新该值(在我的例子中,JDK 11 --> JDK 15)。 (2认同)

nin*_*our 6

我对这个问题发布了一个新的答案,因为我觉得以前在这里忽略了一些重要的东西,但应该向将来遇到的读者指出。让我们先尝试回答实际问题,然后给出更详细的解释。

当我更新 JDK 和 IDE 时,我缺少哪些未正确更新的设置?或者我完全找错地方了?

此消息是(Java 编译器)的输出javac,并且当参数与启动-source的 JDK 版本不同时默认创建(自 JDK14 起)。javac没有唯一的解决方案,您必须首先考虑是否-source(以及-target)仍然满足您的需求。这意味着:

  • 我想要/需要支持我的工件运行的 JRE(或 JDK)版本是什么?

备注1:-source不能完全独立于 进行处理-target,因为第一个必须 <= 第二个(例如,您不能针对 JDK 17 开发源代码并在 JDK 8 上运行 - 这很酷,但不受支持)。

Remark2:在 Maven 中,参数命名为maven.compiler.sourcemaven.compiler.target,在 Gradle 中sourceCompatibility为 和targetCompatibility,我不知道 Ant 的参数(请检查下面的第三个链接)。

如果您想要/需要保留当前的兼容性设置,那么您基本上有两个选择:

  • (推荐)将-source和替换-target--release。此选项隐式包含针对目标 JRE/JDK 的 API 版本的检查!因此该消息也会消失。
  • 另外添加指向与 相同版本的 JDK 的--system选项。设置该参数还可以考虑 API。它大致是 的替代品,不同之处在于它不指向“rt.jar”,而是指向根目录,就像所做的那样。将其视为“旧 JAVA_HOME”选项。javac--sourcejavac-bootclasspathJAVA_HOME

当然,如果您可以完全切换到更新的 JDK/JRE-source版本来运行,并且可以进行相应的调整(无论如何-target我建议使用)。--release

实际的问题(这就是我写这么多的原因)是,既没有-source也不-target包含对 API 的检查,因此出现了警告。例如(没有通过--release或进行 API 检查--system),可以同时编译-target 1.7 引用,这已在 JDK 8 中添加。当使用较新的 JDK 运行测试时,您甚至可能在本地(CI 中都没有)注意到java.util.function.Consumer。它只是停止在生产中工作。

也可以看看: