Java JPMS报错package不可见:如何访问未模块化依赖包?
解决JPMS启用后访问非模块化依赖的编译错误
当Java项目启用模块系统(JPMS)并添加module-info.java后,非模块化的依赖会被归类到自动模块(而非完全的未命名模块),你的自定义模块默认不会自动读取这些自动模块的内容,因此出现编译错误:
error: package io.prometheus.client is not visible import io.prometheus.client.CollectorRegistry;
^ (package io.prometheus.client is declared in the unnamed module, but module simpleserver does not read it)
解决方法如下:
1. 确定自动模块名
非模块化JAR会被JPMS识别为自动模块,模块名可通过以下方式获取:
- 查看依赖JAR包内的
MANIFEST.MF文件,若存在Automatic-Module-Name属性,直接使用该属性值 - 若无该属性,可通过Maven坐标生成:将groupId(
io.prometheus)和artifactId(simpleclient_hotspot)拼接,把横杠替换为点,得到io.prometheus.simpleclient_hotspot
2. 修改module-info.java
在你的模块声明中添加对该自动模块的依赖声明,示例:
module simpleserver { // 声明依赖Prometheus客户端的自动模块 requires io.prometheus.simpleclient_hotspot; // 若你的代码需要通过反射访问该模块的类,需添加opens语句(按需使用) // opens com.your.project.package to io.prometheus.simpleclient_hotspot; }
这样你的模块就能正常读取Prometheus客户端库的包,编译错误即可解决。
内容的提问来源于stack exchange,提问作者clay
相关产品推荐
相关产品推荐

