【问题标题】:Spring Boot Deployment on Tomcat7 and Log4 issueTomcat7和Log4问题上的Spring Boot部署
【发布时间】:2017-02-03 08:11:00
【问题描述】:

我正在尝试在独立的 tomcat 上运行我的 Spring Boot 应用程序。但是它给了我这个错误

java.io.IOException: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.web.Log4jServletContainerInitializer
        at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:200)
        at org.apache.catalina.startup.WebappServiceLoader.load(WebappServiceLoader.java:158)
        at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:1579)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1280)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:888)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:388)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5522)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1092)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.web.Log4jServletContainerInitializer
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:197)

我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>codingtest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>codingtest</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-spring-boot-starter</artifactId>
            <version>2.18.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
            <groupId>co.paralleluniverse</groupId>
            <artifactId>comsat-tomcat-loader</artifactId>
            <version>0.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

当我在 Eclipse 中运行应用程序时,它可以正常工作。仅当我在独立的 Tomcat 7 上运行它时才会出现此问题。

更新

我注意到

使用了缺失的类
<dependency>
            <groupId>co.paralleluniverse</groupId>
            <artifactId>comsat-tomcat-loader</artifactId>
            <version>0.1.1</version>
            <scope>runtime</scope>
        </dependency>

我试图删除依赖并在Tomcat 7上安装war文件。这次我得到了不同的错误

Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.util.descriptor.tld.TldParser
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
        ... 15 more

Feb 03, 2017 7:37:18 PM org.apache.catalina.startup.HostConfig deployWAR
SEVERE: Error deploying web application archive D:\apache-tomcat-7.0.73\webapps\ROOT.war
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:903)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1092)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

当我查看指南http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging 时,它似乎很容易。但这不是现实生活中的。

我在这里错过了什么?

【问题讨论】:

  • 通过说“在 Tomcat 7 上运行它”你想说你编译了一个 WAR 文件并将它部署在服务器上?通常是因为您没有打包 Apache Logging jar。我在您的pom.xml 中没有看到它。
  • 是的,我将它编译为war文件并部署在服务器上。我尝试添加&lt;dependency&gt; &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt; &lt;artifactId&gt;log4j-core&lt;/artifactId&gt; &lt;/dependency&gt;,但结果是一样的。事实上,当我在 Eclipse 中搜索时,我发现类“Log4jServletContainerInitializer”在 comsat-tomcat-loader 依赖项中。
  • 把jar放到Tomcat 7下libs?我曾经遇到过像你这样的情况,而那个黑客救了我。
  • 我无权访问 Tomcat7 文件夹。我需要把它寄给客户,并期望它开箱即用。
  • 看看我更新的答案。您可能必须按照 Spring Boot 的说明操作 Configure Log4j for Logging

标签: maven spring-boot tomcat7


【解决方案1】:

使用 slf4j,Spring boot 自带 slf4j 和所有标准记录器,你不需要任何额外的依赖

$ jar tvf target/spring-boot-0.1.0.jar | egrep 'log|slf'
 41077 Tue Dec 13 18:07:58 GMT 2016 BOOT-INF/lib/slf4j-api-1.7.22.jar
470633 Fri Dec 09 11:03:02 GMT 2016 BOOT-INF/lib/logback-core-1.1.8.jar
 16521 Tue Dec 13 18:09:00 GMT 2016 BOOT-INF/lib/jcl-over-slf4j-1.7.22.jar
305137 Fri Dec 09 11:05:04 GMT 2016 BOOT-INF/lib/logback-classic-1.1.8.jar
 23647 Tue Dec 13 18:09:06 GMT 2016 BOOT-INF/lib/log4j-over-slf4j-1.7.22.jar
  2310 Thu Dec 22 23:48:14 GMT 2016 BOOT-INF/lib/spring-boot-starter-logging-1.4.3.RELEASE.jar
  4596 Tue Dec 13 18:09:14 GMT 2016 BOOT-INF/lib/jul-to-slf4j-1.7.22.jar
 66802 Thu May 28 09:49:34 BST 2015 BOOT-INF/lib/jboss-logging-3.3.0.Final.jar

【讨论】:

    【解决方案2】:

    Spring Boot 1.3 删除了 log4j(1) 支持(请参阅Release Notes)。因此,您可能在类路径中没有 log4j jar。但是仅将 jar 添加到类路径不会恢复 Spring Boot log4j 支持。

    所以要么考虑使用受支持的日志框架,将 Spring Boot 回滚到 1.3 以下的版本(不推荐),要么让 log4j(1) 与 Spring Boot 1.5 一起工作。

    更新:我现在注意到您没有使用 log4j1(我首先假设)但已经使用 log4j2。那没问题。在这种情况下,您可能必须遵循 Spring Boot 中关于如何Configure Log4j for logging 的说明。

    抱歉给你指错了方向……

    【讨论】:

    • 我从未明确告诉 Spring Boot 使用 log4j。错误突然冒出来。我如何告诉 Spring Boot 使用让我们说 slf4j ?
    • 问题是您的代码(或您使用的库)使用什么作为日志框架。似乎在某个地方使用了 log4j - 如果是这样 - 您将不得不提供该库以避免 ClassNotFoundExceptions。 Spring Boot 的日志记录配置属性可能不起作用。查看 Spring-Boot 的 logging 文档。当提到 log4j 时,请注意 log4j2 的含义。
    • 修复方法是删除使用 log4j 的comsat-tomcat-loader(感谢您)。并使用SpringBootServletInitializer 扩展我的Spring Boot 应用程序,如docs.spring.io/spring-boot/docs/current/reference/html/… 中所述。
    • 所以这个答案几乎没有回答你的问题。我建议将您的修复放在自己的答案中并接受这个。
    【解决方案3】:

    我做了以下修复

    1. 删除了使用 log4j 的 comsat-tomcat-loader 依赖项(感谢 @FrVaBe)。

    2. 如 docs.spring.io/spring-boot/docs/current/reference/html/ 中所述,使用 SpringBootServletInitializer 扩展了我的 Spring Boot 应用程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 2021-04-28
      • 2019-03-30
      • 2019-08-03
      • 2020-01-09
      • 2020-08-28
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多