仅在执行Runnable JAR时抛出异常:java.lang.NoClassDefFoundError:org / apache / logging / log4j / LogManager

时间:2016-02-13 04:33:20

标签: java eclipse maven maven-3 log4j2

我有一个使用log4j2 2.5的maven java项目(不是log4j版本1.x)。

我在这里看了很多关于我的问题的帖子,但对我没什么用,所以请有人帮帮我吗?

我以下列方式使用log4j2:

1)在我的每个班级中导入包:

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

2)对于每个班级,在课程后面我立即创建一个记录器:

public class A {

    // log4j2 logger
    private static final Logger logger = LogManager.getLogger(Main.class.getName());

}

3)我在步骤2中创建了记录器后,我正常使用它:

    logger.trace("some message");
    logger.info("another message");

我已将log4j2.xml文件放在src \ main \ resources中(此文件夹位于类路径中):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Properties>
        <Property name="LOG_DIR">.</Property>
        <Property name="ARCHIVE">output.log</Property>
        <Property name="CONSOLE_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</Property>
        <Property name="FILE_PATTERN">%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${CONSOLE_PATTERN}"/>
        </Console>
        <File name="file" fileName="${LOG_DIR}/${ARCHIVE}" immediateFlush="false" append="false">
            <PatternLayout pattern="${FILE_PATTERN}"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="INFO" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file"/>
        </Root>
        <Logger name="com.distributed.analyzer" level="TRACE" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file"/>
        </Logger>
        <Logger name="com.distributed.analyzer.errors" level="ERROR" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file"/>        
        </Logger>
    </Loggers>
</Configuration>

关于maven,我已经为maven添加了log4j2依赖项:

log4j-api-2.5.jar
log4j-core-2.5.jar
pom.xml文件中的

我指定如下:

 <dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.5</version>
    </dependency>   

从eclipse开始,我可以毫无问题地构建项目(没有错误),我也可以执行它。一切都正确。

所以我现在要做的是获取一个可运行的jar文件,以便我可以使用下面的命令行执行:

java -jar myapp.jar

因此,为了以简单的方式构建它,我使用maven-shade-plugin,并在我的pom.xml中指定它,如下所示:

<plugins>           
    <!-- Maven Shade Plugin -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.distributed.analyzer.Main</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
  </plugin>
</plugins>

所以我使用以下目标构建它:compile package

JAR文件已正确创建,但是当我使用以下命令从命令行启动它时

java -jar myapp.jar

下面显示错误信息(好像找不到log4j2 ......我不明白):

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
        at com.distributed.analyzer.Main.<clinit>(Main.java:22)
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

在eclipse中运行程序时一切正常,但是当我用maven打包并尝试运行jar时我会遇到这种错误......

更新: 如果我使用eclipse中的export选项创建runnable jar并检查: “将所需的库打包到生成的JAR中”,然后正确创建JAR包。它包含根目录中的所有jar文件和包含所有资源的文件夹资源,但如果我再次使用:

执行
java -jar myapp.jar

我继续收到类似的错误:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

0 个答案:

没有答案