我有一个使用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.