SpringBoot入门: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

1
<packaging>war</packaging>

2、新增依赖

1
2
3
4
5
<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下面运行会报错的。类似这种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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方法

1
2
3
4
5
6
7
8
9
10
@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 下新增:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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的,但部署到生产就可能出现各种问题。


SpringBoot入门:SpringBoot应用以war包方式部署到Tomcat
https://river106.cn/posts/10d016c1.html
作者
river106
发布于
2018年9月16日
许可协议