Netbeans 9 Beta集成Log4j 2.11遇模块未识别问题求助
这个问题的核心是Log4j 2.11.0的log4j-api.jar属于Java 9的自动模块,它的自动模块名和你在module-info.java里写的不匹配,导致NetBeans的静态分析报错,虽然Maven构建能正常运行。下面给你两个可行的解决方案:
方案一:修改module-info.java中的模块依赖声明
NetBeans输入requires log时提示的log4j.api,就是log4j-api-2.11.0.jar的自动模块名(自动模块名由Jar文件名推导而来:去掉版本号、把连字符替换成点)。你只需要把原来的依赖声明改成这个名字即可:
原来的代码:
requires org.apache.logging.log4j;
修改为:
requires log4j.api;
修改后,NetBeans应该就能正确识别这个模块,不再报错,同时也能正常识别Jar里的日志类。
方案二:升级Log4j到支持显式模块的版本
从Log4j 2.12.0开始,官方为log4j-api和log4j-core添加了显式的module-info.java,模块名正式定为org.apache.logging.log4j和org.apache.logging.log4j.core,和你原来写的声明完全匹配。
你只需要修改pom.xml里的Log4j依赖版本:
<!-- Logs --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.12.0</version> </dependency>
升级后不需要修改module-info.java,NetBeans就能正常识别org.apache.logging.log4j模块,同时解决类识别的问题。
补充说明
为什么Maven构建能成功但NetBeans报错?因为Maven在处理模块路径时,对自动模块名的匹配相对宽松;而NetBeans的静态代码分析严格遵循Java 9模块化规则,要求requires语句必须和实际的模块名(自动模块名或显式模块名)完全一致。
内容的提问来源于stack exchange,提问作者Vitaliy Tsirkunov

