是否有任何 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”。
在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”。