Java 9自动模块编译报错:Maven找不到spring.web等模块
我来帮你拆解下这个问题——你遇到的情况其实是早期Maven版本对Java模块系统(JPMS)的支持不完善导致的:IntelliJ能正常识别是因为它自己做了模块路径的适配处理,但Maven 3.5.3默认还是把依赖放到类路径而非模块路径,自然找不到这些自动模块。结合你的配置,具体修复步骤如下:
1. 升级Maven版本到3.6.x及以上
Maven 3.5.3对JPMS的支持比较有限,3.6.0及更高版本才对模块路径的处理做了完善优化,能自动识别自动模块并将依赖加入模块路径。建议直接升级到3.8.x系列(稳定且兼容性好)。
2. 升级maven-compiler-plugin到3.8.0+
你当前用的3.7.0版本虽然宣称支持Java 9,但在自动模块的处理上有缺陷。升级到3.8.0+后,插件会自动处理模块路径,无需额外配置就能识别自动模块。修改pom.xml里的编译插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 推荐用这个版本或更高 --> <configuration> <release>10</release> <!-- 用release替代source/target,Java 9+的规范写法 --> </configuration> </plugin>
用<release>标签可以确保编译时的源、目标版本和运行时环境一致,避免版本不匹配的问题。
3. 调整依赖的引入方式
看你的pom.xml,apache-sshd引入的是pom类型的依赖,这不会直接把sshd-core的jar包加入到模块路径里。你需要显式引入sshd-core的依赖,这样Maven才能把它识别为自动模块:
<dependency> <groupId>org.apache.sshd</groupId> <artifactId>sshd-core</artifactId> <version>1.7.0</version> </dependency>
其他如果是pom类型的依赖,也需要调整为具体的jar依赖,确保Maven能正确抓取到对应模块的jar包。
4. 清理缓存并重新编译
做完以上修改后,执行以下命令清理Maven缓存并重新构建:
mvn clean install
这一步能确保Maven重新下载依赖并正确处理模块路径,避免旧缓存的干扰。
验证
完成上述步骤后,再次运行Maven编译,应该就能顺利识别所有自动模块,不会再出现module not found的错误了。
内容的提问来源于stack exchange,提问作者pinpinokio

