Springboot生成war部署到Tomcat

Posted sadoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot生成war部署到Tomcat相关的知识,希望对你有一定的参考价值。

前言

今天刚好一个同事叫我友情协助给个简单的war包他,用来作为培训的素材。确实是个很简单的东西,我却整整坑了2个多小时在里面。因为这些年用springboot都是生成jar包直接启动,还真没做过几个项目是生成war扔tomcat上的。结果好一阵子搜索,其实也没什么,无非就是pom排除内嵌的tomcat,主类继承SpringBootServletInitializer并重写的configure方法。但就这么点简单的东西居然也坑了,正好就mark一下。

简单实例

一般很多时候都是用jar跑就行了,生成war的话需要修改pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.gdtel.iboc</groupId>
	<artifactId>HelloWorld</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<packaging>war</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.0.RELEASE</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>

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

	<build>
		<finalName>helloworld</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

第八行<packaging>标签里面是war,表示我们要打包生成的是war包。因为springboot自带tomcat,和要部署的tomcat的包可能存在版本冲突,需要排除,21-30行就是解决这个问题。34行代表我们要生成war包的名称。

接下来要修改主类,假设这里我的主类是App.class

@SpringBootApplication
public class App extends SpringBootServletInitializer

	public static void main(String[] args) 
		SpringApplication.run(App.class, args);
	
	
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) 
        return builder.sources(App.class);
    

这里继承SpringBootServletInitializer并重写configure方法。然后执行mvn package,把生成的war包扔tomcat的webapps目录下即可,启动tomcat即可。

坑点

今天被坑主要原因在于两点:

1、Springboot2.x以上要用tomcat8.5以上。我用的是好多年前下的tomcat8.0,因此怎么折腾都报错主要是报invalid LOC header,查了半天,大部分答案都是说jar包损坏重新下一次,但用maven test跑没报错,所以并不是这个问题。

2、Java EE生成的javaweb要放在tomcat10的webapps-javaee目录下(没有就新建一个)。我按惯例放webapps下,结果跑不起来。因为webapps下放的要用Jakarta EE,具体原因可以网上查。所以要么通过转换工具把Java EE转成Jakarta EE,要么放到webapps-javaee下让tomcat给你转。

以上是关于Springboot生成war部署到Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot打war包并部署到tomcat下运行

springboot项目打war包,并部署到tomcat

Spring Boot:在 Tomcat 7 上部署 WAR

在部署到Servlet容器之前,如何生成包含SpringBoot的War文件

SpringBoot应用War包形式部署到外部Tomcat

springboot使用war包部署到外部tomcat