是否有任何 JDK 11+ 系统模块不是根模块?

Are there any JDK 11+ system modules which are not root modules?

在JDKs 9和10中,曾经有一些模块,例如java.xml.bind,包含Java EE 类。它们被标记为已弃用,并随着 JDK 9 的出现而被删除,并最终在 11 中被删除(参见 JEP 320)。在我贡献的产品中,曾经有 javac 编译器选项 --add-modules 的测试,将这些模块添加为根模块。 JDK 11+ 已停用这些测试。我不想删除它们,而是想重新激活它们,如果有任何其他 JDK 模块默认也是非 root 的。然后测试可以只使用这些模块。

我知道我可以用我自己的模块测试 --add-modules,但我必须在模块路径上指定它们。通过 --add-modules 添加的 JDK 模块不需要额外的模块路径的测试用例也很有趣,如果仍然存在要测试的 JDK 11+ 模块。我说的不是非导出包,而是非根 JDK 模块。

所以,根据 中的信息,我实际上是在 导出的系统模块中寻找非 java.* 模块至少一包不合格。在那种情况下,那些模块不应该是 root,它们将有资格用于我的测试用例。


更新: 我正在寻找的是 JDK 9:

中的等效项
import javax.xml.bind.JAXBContext;

public class UsesJAXB {
  JAXBContext context;
}
xx> "C:\Program Files\Java\jdk-9.0.4\bin"\javac UsesJAXB.java
UsesJAXB.java:1: error: package javax.xml.bind is not visible
import javax.xml.bind.JAXBContext;
                ^
  (package javax.xml.bind is declared in module java.xml.bind, which is not in the module graph)
1 error

xx> "C:\Program Files\Java\jdk-9.0.4\bin"\javac --add-modules java.xml.bind UsesJAXB.java

看到了吗?使用 --add-modules 它会构建,没有它则不会。

我正在寻找 JDK 11-18 中的模块(如果有的话),当在一个简单的程序中导入它们的 类 时会产生相同的结果,即要求它们被显式添加通过 --add-modules 进行编译(不讨论运行时)。

您可以列出 jdk 的所有模块:

java --list-modules

然后你可以打印模块描述符:

java --describe-module a.module.name

在一个小脚本中过滤这些输出后,这里是我的 JDK 17 的模块:

jdk.charsets
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.editpad
jdk.internal.vm.compiler
jdk.internal.vm.compiler.management
jdk.jcmd
jdk.jdwp.agent
jdk.jlink
jdk.jpackage
jdk.localedata
jdk.zipfs
例如

jdk.charsets是提供服务的模块


问题更新后更新

所以你正在寻找一个导出包但在未命名模块中编译 class 时不在默认模块图中的模块。根据 JEP,只有 java.* 个模块符合条件。

当我通过 java.se(当它存在时是根模块)直接或间接地寻找所需的模块时,我看到 [=58] 的所有 java.* 模块=],但 java.smartcardio。由于一些未知的魔法,java.smartcardio 也在默认图表中:我试图编译一个 class 导入它的一个 class 并且它在没有 --add-modules.[= 的情况下工作26=]

所以我认为您正在使用 non-java 模块,不导出包(如 jdk.charsets),导入其中一个 class(如 sun.nio.cs.ext.ExtendedCharsets)和或者:

  • 在编译测试 class 时除了 --add-modules 添加 --add-exports 以便 javac 成功。
  • 或者解析javac的错误信息,区分“not in the module graph”和“not exported”。