最近,在用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的,但部署到生产就可能出现各种问题。