Java 17中java.se模块未被加载的问题求助
为什么Java 17中代码无法获取到java.se模块?
java.se是一个聚合模块(aggregator module),它的作用仅仅是声明对所有Java SE规范定义模块的依赖,本身不包含任何可执行代码或资源文件。这种模块在JVM启动时默认不会被加载到启动模块层,核心原因如下:
- JVM启动时会自动解析并加载程序运行必需的模块,聚合模块本身不是运行时的依赖项,所以默认不会被包含在
ModuleLayer.boot().modules()返回的集合中。 - 只有当你显式通过启动参数
--add-modules java.se指定加载它,或者你的代码所在模块直接依赖java.se时,它才会被加入到启动模块层。
验证方式
- 执行
java --list-modules命令查看默认加载的模块,输出里不会出现java.se;但执行java --add-modules java.se --list-modules,就能看到它出现在列表中。 - 修改你的程序启动参数,添加
--add-modules java.se后再运行代码,java.se就会出现在输出结果里。
另外,你当前的过滤逻辑可以优化:Java SE规范的模块都是以java.开头的,用x.startsWith("java.")来筛选会更准确,不过这和java.se模块不出现的问题无关。
内容的提问来源于stack exchange,提问作者LoukasPap
相关产品推荐
相关产品推荐

