1. 程式人生 > >SpringBoot應用以war包方式部署到Tomcat

SpringBoot應用以war包方式部署到Tomcat

最近,在用springboot開發一個小應用,springboot預設提供內嵌的tomcat,所以打包直接生成jar包,用java -jar命令就可以啟動。但

是,有時候我們更希望一個tomcat來管理多個專案,這種情況下就需要專案是war格式的包而不是jar格式的包。接下來就開始吧!

我使用的jdk和tomcat版本:

IDE: Eclipse Luna 4.4.0

JDK版本:1.7.0_60-ea

Tomcat版本:7.0.79

1、首先將pom.xml將打包方式改成war

<packaging>war</packaging>

2、新增依賴

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

這個依賴打war包時加入, 告訴spring-boot tomcat相關jar包用外部的,不要打進去。

此處當心,如果你用Tomcat版本是7,很容易部署不成功,我也遇到過,查詢資料說SpringBoot預設Servlet容器是基於Tomcat8,

Tomcat8的embed包在Tomcat7下面執行會報錯的。類似這種:

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[ /report]] 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:1092) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 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:150) 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

3、將專案的啟動類Application.java繼承SpringBootServletInitializer並重寫configure方法

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

4、使用maven外掛進行打包。

在pom.xml中的project 下新增:

<build>
    <finalName>jishu</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

使用eclipse,Run As->Maven Build... , Goals 中輸入clean package ,即可打包。然後將war包放入Tomcat的webapps目錄下,啟動tomcat,即可完成自動解壓部署。

在開發環境和部署到生產的時候,jdk和tomcat版本最好要一致,比如jdk1.7,tomcat也要7,否則,開發測試時時ok的,但部署到生產就可能出現各種問題。