log4j2出现java.lang.NoClassDefFoundError错误: org/apache/logging/log4j/LogManager

13

我在我的Java应用程序中使用log4j 2.3。我通过Maven添加了依赖项。
在Eclipse中运行程序时一切正常,但是当我使用Maven打包并尝试运行jar文件时,我会收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache logging/log4j/LogManager
    at main.myclass.<clinit>(myclass.java:11)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager 


    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

当从一个JAR文件运行程序时,为什么找不到该类?

添加log4j 1.2也没有起作用。该程序在Eclipse中运行良好,因此不应该缺少依赖项。


1
你可能遇到了依赖崩溃问题,其中一个依赖项具有对log4j 1.x的传递依赖。使用“mvn dependency:tree”查找罪魁祸首。另外,请参见https://dev59.com/Tl8d5IYBdhLWcg3w41cp。 - Tobb
1
你需要在类路径中拥有log4j jar包。你是如何执行你的应用程序的? - Amila
有没有办法在Eclipse中执行mvn dependency:tree命令?我没有安装用于命令行的Maven,只是在Eclipse中使用它。我已经在我的pom.xml文件中添加了log4j-core(2.3)和log4j-api(2.3)作为依赖项。我通过java -jar myApplication.jar命令从命令行运行它。 - Pabi
3个回答

20

当您从命令行运行应用程序jar包时,依赖的jar包在运行时不可用。您需要在pom.xml中包含以下两个插件之一,以便在运行时获得依赖项。

使用:maven-shade-plugin

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>org.sonatype.haven.HavenCli</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

使用:maven-dependency-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.8</version>
    <executions>
        <execution>
             <id>copy-dependencies</id>
             <phase>package</phase>
             <goals>
                 <goal>copy-dependencies</goal>
             </goals>
             <configuration>
                 <outputDirectory>${project.build.directory}/lib</outputDirectory>
             </configuration>
        </execution>
     </executions>
</plugin>
当您执行 mvn package 命令时,它会生成一个超级 JAR 文件或将依赖项复制到 outputDirectory 目录中。我建议使用 maven-shade-plugin 插件以生成带有所有依赖项的单一 JAR 文件。

我有完全相同的问题,而且maven-shade-plugin对我没有用。我正在使用maven-shaden-plugin,一旦它创建了jar包,我就用java -jar myapp.jar执行我的应用程序,但我仍然收到相同的错误。我做错了什么? - Willy
使用shade-plugin时,我需要更改<mainClass>的内容吗?还是这里有另一个范围? - Ahmed Hasn.
@Garry,“maven-shade-plugin”完美地工作了。谢谢。 - user7548672

1
请在库中将jar文件添加到类路径中,这对我有用。

-2

安装最新版本的log4j(我已经安装了log4j-2.3.jar

然后按照以下步骤进行:

  • 右键单击项目 -> 构建路径 -> 库 -> 添加外部JAR包 -> 包括Log4j、Log4j核心和Log4j API JAR包。

这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接