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的,但部署到生產就可能出現各種問題。