【问题标题】:Compilation failure: module not found: org.apache.logging.log4j编译失败:找不到模块:org.apache.logging.log4j
【发布时间】:2018-11-15 19:31:52
【问题描述】:

我有一个用 Java 11 编写的简单应用程序。mvn clean verify (maven 3.6.0) 执行时出现错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project parser: Compilation failure
[ERROR] ...src/main/java/module-info.java:[2,32] module not found: org.apache.logging.log4j  

依赖关系:

<log4j.version>2.11.1</log4j.version>

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j.version}</version>
</dependency>

模块信息.java:

module abc {
    requires org.apache.logging.log4j;
}

Log4j2 配置是默认配置,在 .xml 文件中。用法:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

private static final Logger logger = LogManager.getLogger(Abc.class); 

logger.info("Boom!");

我尝试了有关 stackoverflow 的所有相关问题,但均未成功。

【问题讨论】:

  • 您能否尝试升级您的maven-compiler-plugin 并将版本指定为11?由于使用 --release 11 描述 log4j-api jar 声明与指令中的名称相同。原因主要是 log4j-api 是一个模块化的 jar。请注意,另一方面,log4j-core 是作为自动模块派生的。
  • 谢谢!它有帮助。你想写答案吗?最好使用链接中引用的answer。就我而言,我只需要将 maven 编译器插件的版本升级到 3.8.0。我的 java 版本是 11。
  • 做出了回答,因为专门为log4j-api 使用发布标志似乎有轻微的影响,这是一个模块化的 jar。此外,也许图书馆的一些贡献者自己会提供关于模块化的更多细节以及未来使用图书馆的计划。

标签: java maven log4j2 java-module java-11


【解决方案1】:

您应升级到maven-compiler-plugin:3.8.0将版本指定为 11

原因是,在使用 --release 11 描述 log4j-api.jar 时,声明与您的指令中的名称相同。

jar --file=.../.m2/repository/org/apache/logging/log4j/log4j-api/2.11.1/log4j-api-2.11.1.jar --describe-module --release 11
releases: 9

org.apache.logging.log4j jar:file://.../.m2/repository/org/apache/logging/log4j/log4j-api/2.11.1/log4j-api-2.11.1.jar/!META-INF/versions/9/module-info.class
exports org.apache.logging.log4j
exports org.apache.logging.log4j.message
exports org.apache.logging.log4j.simple
exports org.apache.logging.log4j.spi
exports org.apache.logging.log4j.status
exports org.apache.logging.log4j.util
requires java.base mandated
uses org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory
uses org.apache.logging.log4j.spi.Provider
uses org.apache.logging.log4j.util.PropertySource

这主要是因为 log4j-api 是一个模块化 jar

另一方面,log4j-core 派生为一个 自动模块,它仍然在其 MANIFEST.MF 中被覆盖为

org.apache.logging.log4j.core

【讨论】:

    【解决方案2】:

    尽管更改了 @Naman 提到的更新编译器插件,但如果您使用 maven javadoc 插件使用类似 'mvn clean install javadoc:javadoc' 的命令生成 javadocs,则可能会出现类似错误:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:3.2.0:javadoc (default-cli) on project data-exchange-common-configuration: An error has occurred in Javadoc report generation:       
    [ERROR] Exit code: 1 - your.module\src\main\java\module-info.java:20: error: module not found: org.apache.logging.log4j          
    [ERROR]   requires org.apache.logging.log4j;                                                                                                                                                                      
    [ERROR]                              ^                                                                                                                                                                            
    [ERROR]                                                                                                                                                                                                           
    [ERROR] Command line was: cmd.exe /X /C "C:\Programs\Java\Oracle\jdk-11.0.6\bin\javadoc.exe @options @packages @argfile"                                                                                          
    [ERROR]                                                                                                                                                                                                           
    [ERROR] Refer to the generated Javadoc files in 'C:\Source\dex\dex1\ais-data-exchange\data-exchange-common\data-exchange-common-configuration\target\site\apidocs' dir.                                           
    

    目前的解决方案(直到问题在插件级别得到解决)是生成 api docs 设置 source 版本为 java 8(同时保持编译器版本仍为 java 9+):

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>3.2.0</version>
                    <configuration>
                        <source>8</source>
                        <detectJavaApiLink>false</detectJavaApiLink>
                    </configuration>
                </plugin>
                
    

    在上面的例子中,请注意我也设置了 false,这是由于在 java 8 中生成源时存在的一些其他错误。无论如何将 source 参数设置为 8 和 detectJavaApiLink em> 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 2021-01-12
      • 2021-03-07
      • 2019-05-23
      • 2012-10-02
      • 2021-12-05
      • 1970-01-01
      • 2020-01-12
      相关资源
      最近更新 更多