【问题标题】:Spring Boot App deploys but won't startup in Tomcat 8Spring Boot App 部署但不会在 Tomcat 8 中启动
【发布时间】:2020-06-30 02:51:57
【问题描述】:

我一直致力于将 Spring Boot Web 应用程序与 Jenkins 和 Tomcat 9 集成。当我在 Eclipse 中将它作为 Spring Boot 应用程序运行时,一切似乎都很好。

我现在正在设置 Jenkins 和 test/qa/show-and-tell 环境。当我尝试在独立的 Tomcat9 环境中部署 war 时,我的应用无法正常启动。

我遵循spring boot docs 并让 Eclipse 为我完成大部分 Tomcat 集成。我还使用以下线程作为清单... How to deploy spring boot web application on tomcat server

我在我的开发机器上以及将 Jenkins 和 Tomcat 9 作为服务运行的目标环境中获得了相同的堆栈跟踪。

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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.myapp</groupId>
<artifactId>myapp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <maven.test.skip>true</maven.test.skip>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
   <!--      <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>-->
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>   
    </dependency>
    <dependency>  
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <skipTests>${skipTests}</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>

application.properties

spring.datasource.url=jdbc:mysql://localhost:3305/myapp?useSSL=false
spring.datasource.username=*****
spring.datasource.password=*****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true

spring.mvc.view.prefix: /WEB-INF/
spring.mvc.view.suffix: .jsp
spring.messages.basename=validation

server.servlet.context-path=/

spring.jackson.serialization.wrap-root-value=false

WebApplication.java


    @SpringBootApplication
    @EntityScan("com.myapp.model")
    public class WebApplication extends SpringBootServletInitializer implements ApplicationRunner{

        private static final Logger logger = LogManager.getLogger(WebApplication.class);

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(WebApplication.class);
        }

        @Override
        public void run(ApplicationArguments applicationArguments) throws Exception {
            logger.debug("Debugging log");
            logger.info("Info log");
            logger.warn("Hey, This is a warning!");
            logger.error("Oops! We have an Error. OK");
            logger.fatal("Snap! Fatal error. Please fix me.");
        }

        public static void main(String[] args) throws Exception {
            SpringApplication.run(WebApplication.class, args);
        }
    }

Tomcat 登录错误

18-Mar-2020 18:43:38.712 SEVERE [http-nio-8080-exec-7] org.apache.catalina.core.StandardContext.startInternal Error during ServletContainerInitializer processing
    javax.servlet.ServletException: Failed to instantiate WebApplicationInitializer class
        at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:157)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5140)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:493)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1642)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
        at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1590)
        at org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:294)
        at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:212)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:211)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:666)
        at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348)
        at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:53)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.StackOverflowError
        at java.lang.reflect.InvocationTargetException.<init>(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:110)
        at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:123)
        at org.apache.logging.log4j.util.StackLocatorUtil.getCallerClass(StackLocatorUtil.java:55)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:42)
        at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
        at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
        at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
        at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
        at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)

【问题讨论】:

  • 这些是您真正的依赖还是用于发布的简化版本?如果它们是真实的,则您的服务器包含一个额外的 jar,用于将日志记录路由到 slf4j(或 log4j2),这会导致错误,因为您拥有的依赖项中包含了另一种方式。 slf4j -> log4j2 -> slf4j -> log4j2 -> .... 直到发生堆栈溢出为止。
  • @M.Deinum - 感谢您的快速回复!那是我的实际 POM……我猜这个页面:logicbig.com/tutorials/spring-framework/spring-boot/log4j2.html 列出了我需要的罐子……有没有更简单的方法来登录我的堆栈,或者我应该继续在这个页面中包含 5 个罐子指导我的 Maven 依赖项?
  • 这些罐子已经包含在您正在使用的启动器中。但是你为什么不直接使用默认的日志框架,Logback?你也排除了(我在你的 pom 中没有看到)。
  • 我只是按照我找到的教程进行操作...我决定暂时去掉日志记录,直到我可以启动并运行测试环境。我对 log4j 比较熟悉,因为我过去使用过它,并且复杂的事情将 log4j2 带入了图片......
  • Logback 是默认设置,您应该使用 SLF4J 作为日志记录 API。

标签: spring spring-boot maven tomcat9


【解决方案1】:

试试驱动类名: com.cj.mysql.jdbc.Driver

【讨论】:

    【解决方案2】:

    这是由于与我的日志记录 jar 冲突引起的...我注释掉了 maven log4j2 依赖项并切换到 Logback。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多