You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 9+Maven迁移构建报错:模块找不到问题求助

Java 9迁移:Maven编译找不到自动模块的问题解决

我来帮你拆解下这个问题——你遇到的情况是典型的Maven插件版本不兼容Java 9模块系统导致的:IntelliJ能识别依赖是因为它自己的构建引擎单独处理了模块路径,但Maven用旧版本的编译插件时,根本没把非模块化依赖放到模块路径里,自然找不到这些自动模块。

问题根源

  1. 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的话,这个参数起不到任何作用。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:43