JDK 10 Eclipse Maven模块化项目编译报错:找不到log4j.api模块
这个报错的核心原因很清晰:你在module-info.java里引用的模块名称和Log4j API实际的模块名称不匹配。
为什么会报错?
Java模块系统中,requires关键字后面需要跟模块的正式名称,而不是Maven依赖的artifactId。对于Log4j 2.11.0版本的log4j-api,它的正式模块名称是org.apache.logging.log4j,而不是你写的log4j.api——这就是编译失败的直接原因。
具体修复步骤
修正
module-info.java的模块声明
把你的module-info.java中的requires log4j.api;替换成正确的模块名称:module project { exports com.mycompany.tbe.myproject; requires org.apache.logging.log4j; // 这里是正确的模块名称 }如果你在代码中直接使用了Log4j Core的API(比如配置Logger的具体实现),还需要额外添加对Log4j Core模块的依赖声明:
requires org.apache.logging.log4j.core;验证Maven依赖与编译配置
你的pom.xml配置基本没问题,但可以做两个小检查:- 确认
maven-compiler-plugin的release参数已经设置为10,这会让Maven正确处理JDK 10的模块系统(你的配置里已经加了,这点很好) - 执行
mvn clean install -U强制更新依赖,确保Log4j的JAR包已经正确下载到本地仓库,避免因依赖缺失导致的模块找不到问题
- 确认
关于Maven Jar插件的小提示
注意你当前的maven-jar-plugin配置中使用了jar-with-dependencies的descriptorRef,这会把所有依赖打包进一个JAR。对于模块化项目,这种"胖JAR"方式可能会破坏模块系统的隔离性,如果你需要保留模块化特性,建议改用模块化的打包方式(比如使用maven-jlink-plugin生成自定义运行时镜像),或者如果不需要模块系统,可以移除module-info.java。
验证修复
修改完成后,重新执行mvn clean package,编译应该就能正常通过了。
内容的提问来源于stack exchange,提问作者Tapas Bose

