1. 程式人生 > >springboot專案打成war包部署到tomcat遇到的一些問題

springboot專案打成war包部署到tomcat遇到的一些問題

參考:http://blog.csdn.net/u010317202/article/details/50379057
開發環境使用jdk1.8.0_60,把springboot 專案打成war包後,
部署到apache-tomcat-7.0.68時報錯如下,換成apache-tomcat-8.0.9解決

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/my-springboot-web-0.0.1]]
        at org.apache
.catalina.util.LifecycleBase.start(LifecycleBase.java:153) 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:1091) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1980) 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.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:149) at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5573) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) ... 10 more 六月 22, 2017 12:19:15 上午 org.apache.catalina.startup.HostConfig deployWAR 嚴重: Error deploying web application archive E:\Data\apache-tomcat-7.0.68\webapps\my-springboot-web-0.0.1.war java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/my-springboot-web-0.0.1]] 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:1091) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1980) 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)

另外springboot專案打成war包部署到tomcat時需要改變啟動方式,否則執行tomcat時war包只會解壓,但是載入不了

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

@SpringBootApplication   //- springboot專案,並配置掃描路徑
@EnableAutoConfiguration //- springboot自動配置,這個註解可以根據你依賴的包自動生成相關配置
public class StartApp  extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(StartApp.class, args);
    }

    /**
     * 需要把web專案打成war包部署到外部tomcat執行時需要改變啟動方式
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(StartApp.class);
    }

部署到外部tomcat時,注意pom.xml配置,否則會報錯

<!-- 這裡指定打war包的時不再需要tomcat相關的包,但是本地執行時必須註釋掉,否則會報錯 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>1.3.5.RELEASE</version>
            <scope>provided</scope>
        </dependency>

**報錯資訊:**
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)
    at com.StartApp.main(StartApp.java:13)
Caused by: java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
    at org.apache.catalina.util.LifecycleBase.<clinit>(LifecycleBase.java:37)
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:158)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:160)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
    ... 8 more
Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more

springboot專案使用jsp頁面時需要新增以下依賴,但是在外部tomcat執行時會報錯
因為tomcat /lib下自帶的jar包(jasper.jar,jsp-api.jar等)會跟war包專案路徑/lib下的解析jsp的jar包衝突
在外部tomcat的webapps\專案名稱\WEB-INF\lib下找到以下相關jar包刪除即可,如下圖

<!-- 新增jsp支援 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>8.0.33</version>
        </dependency>

**報錯資訊:**
[ERROR][2017-06-22 00:48:28,303][org.springframework.boot.context.web.ErrorPageFilter]Forwarding to error page from request [/excel] due to exception [java.lang.LinkageError: loader constraint violation: when resolving method "org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(Ljavax/servlet/ServletConfig;)Lorg/apache/tomcat/InstanceManager;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/jsp/excel_jsp, and the class loader (instance of java/net/URLClassLoader) for the method's defining class, org/apache/jasper/runtime/InstanceManagerFactory, have different Class objects for the type org/apache/tomcat/InstanceManager used in the signature]
javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving method "org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(Ljavax/servlet/ServletConfig;)Lorg/apache/tomcat/InstanceManager;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/jsp/excel_jsp, and the class loader (instance of java/net/URLClassLoader) for the method's defining class, org/apache/jasper/runtime/InstanceManagerFactory, have different Class objects for the type org/apache/tomcat/InstanceManager used in the signature

這裡寫圖片描述