【问题标题】:java.lang.NoClassDefFoundError: Lorg/apache/logging/log4j/Logger; but the artifact existsjava.lang.NoClassDefFoundError: Lorg/apache/logging/log4j/Logger;但神器存在
【发布时间】:2017-01-30 17:19:27
【问题描述】:

我正在使用 Tomcat 部署一个 java webapp。

简而言之,我得到了一个很长的堆栈跟踪:

GRAVE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/new-webapp]]
[...]
Caused by: java.lang.NoClassDefFoundError: Lorg/apache/logging/log4j/Logger;
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2509)
    at java.lang.Class.getDeclaredFields(Class.java:1819)
    at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)
    at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:256)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.java:105)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:64)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:335)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:782)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:306)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5150)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139)
    ... 20 more
[...]

现在,错误非常明显。由于某种原因,log4j 包不在类路径中。

应用是maven webapp,pom.xml是这样的:

<project 
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.wb</groupId>
    <artifactId>new-webapp</artifactId>
    <packaging>war</packaging>
    <version>0.0.1</version>
    <properties>
        <log4j.version>2.5</log4j.version>
    </properties>

    <dependencies>
    [...]
        <!-- Logging -->
        <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>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>
    [...]
</project>

如果我转到项目属性,在 Libraries->Maven Dependencies 下,我会看到:

找到并下载了库,它们位于类路径中。

我还尝试在我的项目中打开一个 java 类并声明

org.apache.logging.log4j.Logger Logger;

没有错误,找到Logger接口。

这里发生了什么?为什么即使库在类路径中,Tomcat 也无法启动?


编辑 - 这是 log4j 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

【问题讨论】:

  • 我看不到图像,但这是 Eclipse 对吧?您是在 IDE 内部还是在外部 Tomcat 中部署?如果在 IDE 中,请确保清理服务器和项目以及任何临时文件,还要确保使用最新的 m2e 和 m2e-wtp。如果使用mvn clean package 打包战争,库是否存在于WEB-INF/lib 中?
  • @Tunaki 我正在 Eclipse 中进行部署,并且我已经尝试清理 Tomcat、Project 和 Tomcat 工作目录。如果我在 Eclipse 服务器路径中的 wtpwebapps 下,在 WEB-INF/lib 下我可以看到三个 jog4j jar。
  • 请检查一下,我发现在使用 log4j 和 tomcat8 tomcat.apache.org/tomcat-8.0-doc/logging.html 时需要执行更多步骤
  • @piyushj 但这是用于配置 tomcat 的内部日志记录。我不想这样做,我只想使用 log4j 类来登录我的应用程序,tomcat 可以有自己的日志库。无论如何,问题是tomcat似乎忽略了log4j。配置是在 log4j 文件中完成的,所以如果 log4j 没有加载它就不会工作。
  • 能发一下log4j的配置文件吗?

标签: java maven tomcat classnotfoundexception


【解决方案1】:

根据您的描述,我假设您正在使用 Eclipse。

好吧,你最好转到Project properties -> Deployment assembly 并确保包含maven dependencies 条目。

我经常试验,每当您执行 Maven -> Update Project 时,此配置都会丢失。

【讨论】:

  • 是的,我之前也遇到过,但事实并非如此,Maven 依赖项在那里,WEB-INF/lib 作为部署路径
  • @BackSlash 并且 log4j 包含在 Maven Dependencies 条目中,确定吗?
  • 是的,如图所示。此外,在 log4j 之前还有其他配置,都来自加载了 maven 的库,它们不会出错,log4j 会。很奇怪。
【解决方案2】:

我正在使用 Eclipse,每次我在 pom.xml 中进行更改时都会遇到同样的问题。我不知道为什么,但 Eclipse 删除了 Maven 依赖项。

解决方案:右击 project,选择 Properties,选择 Deployment Assembly 并在“Source”列中验证名为“Maven Dependencies”的行”。如果不存在,请点击 Add...、Java Build Path Entries 并点击 Maven Dependencies。最后应用并关闭。

【讨论】:

  • 请阅读 cmets - 此外,在 log4j 之前还有其他配置,全部来自加载 maven 的库,它们不会出错,log4j 会。很奇怪 - 这意味着 maven 依赖项已经在类路径中,否则所有 maven 库都会出错。
【解决方案3】:

确保 log4j 库未包含在 Tomcat 运行时(或认可的目录)中,因为它可能会产生有关类加载策略的冲突。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2020-10-17
  • 2020-04-12
  • 2017-12-24
  • 1970-01-01
  • 2018-02-13
  • 2015-11-19
相关资源
最近更新 更多