Java 9+Maven迁移构建报错:模块找不到问题求助
我来帮你拆解下这个问题——你遇到的情况是典型的Maven插件版本不兼容Java 9模块系统导致的:IntelliJ能识别依赖是因为它自己的构建引擎单独处理了模块路径,但Maven用旧版本的编译插件时,根本没把非模块化依赖放到模块路径里,自然找不到这些自动模块。
问题根源
Maven Compiler Plugin版本过低
你当前使用的maven-compiler-plugin版本是3.5.1,这个版本2016年就发布了,早于Java 9的推出,完全不支持Java平台模块系统(JPMS)。哪怕你在配置里指定了<source>9</source>和<target>9</target>,它还是会把所有依赖丢到类路径而非模块路径上,而Java 9的模块编译要求依赖必须在模块路径才能被识别为自动模块。
你配置里的<compilerVersion>3.7.0</compilerVersion>只是指定javac的版本,但插件本身不支持JPMS的话,这个参数起不到任何作用。IDE与Maven的构建逻辑差异
IntelliJ的内置构建系统会自动适配Java 9的模块规则,把依赖放到模块路径里,所以它能识别log4j等依赖;但Maven完全依赖插件的逻辑,旧插件没做模块路径的处理,导致编译失败。
解决方案
1. 升级Maven Compiler Plugin到支持JPMS的版本
至少要升级到3.7.0及以上(推荐用3.8.1或更高版本,兼容性更好)。修改你的插件配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 升级到支持Java 9的版本 --> <configuration> <source>9</source> <target>9</target> <showWarnings>true</showWarnings> <!-- 可选,帮助排查模块相关警告 --> </configuration> </plugin>
升级后,插件会自动把非模块化依赖放到模块路径中,这些依赖就会被Java 9识别为自动模块。
2. 确认module-info.java的requires语句正确
非模块化依赖的自动模块名称通常来自JAR文件名(去掉版本号):
log4j-1.2.17.jar→ 自动模块名是log4j,所以requires log4j;是正确的dom4j-1.6.1.jar→ 对应requires dom4j;- 内部未迁移的模块(比如
firstProject)如果是JAR包,同样用文件名作为自动模块名,比如firstProject-1.2.jar对应requires firstProject;
3. 验证Maven的模块路径配置
可以运行以下命令查看构建的debug日志:
mvn clean install -X
在日志中搜索module-path,如果能看到你的依赖被包含在这个路径下,说明插件配置已经生效。
内容的提问来源于stack exchange,提问作者RuntimeError

