引入DNSJava 2.1.8依赖导致JPMS兼容性失效问题求助
问题原因分析
编译失败的核心原因是dnsjava 2.1.8版本并非JPMS兼容模块:该jar包中存在顶级目录下的lookup.class文件(属于无名包),而JPMS规范明确禁止模块包含无名包,导致Maven无法识别其为有效的模块,进而报错module not found: dnsjava。
解决思路
方法一:升级dnsjava至JPMS兼容版本(推荐)
dnsjava从3.x版本开始已适配JPMS,添加了合法的module-info.java并移除了无名包问题。修改pom.xml中的依赖版本为最新兼容版本(例如3.5.2):
<dependency> <groupId>dnsjava</groupId> <artifactId>dnsjava</artifactId> <version>3.5.2</version> </dependency>
升级后,该jar会被识别为合法模块,模块名即为dnsjava,原有的module-info.java无需修改,Maven编译可正常通过。
方法二:将dnsjava作为自动模块兼容使用(仅限无法升级的场景)
若无法升级依赖,需配置Maven编译器插件,强制将该jar视为自动模块并允许无名包:
- 在pom.xml中添加maven-compiler-plugin的配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <source>17</source> <target>17</target> <compilerArgs> <arg>--add-modules</arg> <arg>dnsjava</arg> <arg>--allow-unnamed-packages</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
- 保留原
module-info.java中的requires dnsjava,自动模块名称由jar文件名推导而来(即dnsjava)。注意:--allow-unnamed-packages属于JPMS非标准参数,可能在后续Java版本中被移除,因此仅作为临时方案。
方法三:放弃JPMS模块规范(不推荐)
若项目无需严格遵循JPMS,可直接删除module-info.java文件,Maven会将项目作为传统类路径项目编译,依赖的dnsjava可正常加载。
内容的提问来源于stack exchange,提问作者Grim
相关产品推荐
相关产品推荐

