SpringBoot打成war包在tomcat或wildfly下运行的方法
作者:二师兄-公众号-程序新视界 发布时间:2023-11-23 08:20:56
springboot默认的打包方式为jar包,jar包的有优点是不需要更改的配置,并且内嵌了tomcat,如果打成jar包直接可以丢到docker中运行测试。但是考虑到前端代码只能打成war包,因此干脆也将后端代码打成war包和前端的代码一起放在tomcat容器中的webapps中运行就好了。
SpringBoot打包形式
默认情况下,创建的SpringBoot项目是按照jar包形式来进行打包的。同时,内置了tomcat的容器。
那么,此时如果想让springboot打包成war包,并部署到wildfly等容器,该如何处理?
下面将从创建项目开始逐一讲解。
创建项目
创建项目没有什么难点,使用idea工具创建一个简单的maven项目即可,如果你的项目已经是springboot项目,想要修改为war包形式,对照修改即可。
修改pom.xml配置
创建项目之后,修改pom.xml文件,添加parent标签。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
如果原来是springboot项目,则已经包含了,不用修改。
pom.xml中设置打包方式为war。
<packaging>war</packaging>
添加或修改dependency配置,如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
其中在spring-boot-starter-web中需要排除tomcat的依赖。同时,添加servlet-api的依赖。注意这里添加的依赖为Servlet2.5。
在build中使用如下插件进行打包。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
启动main方法
如果已经存在启动的main方法,则让main方法继承SpringBootServletInitializer,并实现其方法即可。如果是新创建项目,则直接在顶级目录创建SpringBootApp(启动类),然后启动diam如下。
@SpringBootApplication
public class SpringBootApp extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootApp.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringBootApp.class);
}
}
打包
通过maven命令执行package打包即可,在target目录下即可生成war包。
至于tomcat和wildfly的部署,都可将war包放置于对应的目录下启动服务即可。
异常情况
如果在启动时报如类似如下异常(提示缺少web.xml):
Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
注意检查pom文件打包插件和是否排除了tomcat的问题,核查上面的打包插件是否正确。
问题的原因是:springboot项目中引用了依赖包spring-boot-starter-web。该包中引用的spring-boot-starter-tomcat里包含了tomcat嵌入式servlet容器,其不同版本实现的是不同的servlet版本规范。
Servlet/JSP版本2.5/2.1支持Tomcat的版本为6.0.x,最低java版本为1.5。Servlet/JSP版本3.0/2.2支持Tomcat的版本为7.0.x,最低java版本为1.6。
由于上面使用了Servlet2.5,当没有web.xml文件时会出现上面的异常。
解决方式一:当Servlet版本小于3时,使用创建/src/main/webapp/WEB-INF/web.xml文件。
解决方式二:在pom.xml的build下添加maven-war-plugin插件。并设置failOnMissingWebXml为false。
总结
以上所述是小编给大家介绍的SpringBoot打成war包在tomcat或wildfly下运行的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
来源:https://blog.csdn.net/wo541075754/article/details/103066870


猜你喜欢
- 用Canvas画贝塞尔曲线,要画贝塞尔曲线首先了解贝塞尔曲线:由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大
- 这两天遇到一个服务假死的问题,具体现象就是服务不再接收任何请求,客户端会抛出Broken Pipe。检查系统状态执行top,发现CPU和内存
- 一.内部类的介绍 内部类: 一个类定义在 另一个类 的 内部。 &
- 本文实例讲述了Java访问WebService返回XML数据的方法。分享给大家供大家参考。具体如下:import java.io.IOExc
- ArrayBlockingQueue介绍ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指,ArrayB
- 首先利用IDEA创建Maven工程项目1.选择新建项目2.选中Maven骨架3.填写项目名称和项目位置4.Finsh之后默认打开的是pom.
- 方法一第一步:添加引用using System.Printing;第二步:代码public static List<string>
- 本文实例为大家分享了Unity实现聊天室功能的具体代码,供大家参考,具体内容如下简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其
- @Scheduled多个任务同时开始执行只需在springBoot启动类上添加如下代码即可:@Bean publi
- 简介:在团队协作开发的过程中,好的代码管理能更加有效的使日常开发的过程中对各个开发人员提高开发速度。下面将详细介绍在IDEA中使用git提交
- 前言最近在改进项目的并发功能,但开发起来磕磕碰碰的。看了好多资料,总算加深了认识。于是打算配合查看源代码,总结并发编程的原理。准备从用得最多
- 前言大家在学习Java的过程中,或者工作中,始终都绕不开集合。在单线程环境下,ArrayList就可以满足要求。多线程时,我们可以使用Cop
- 使用Apache.POI中HSSFWorkbook导出到Excel,具体内容如下所示:1.引入Poi依赖(3.12)依赖如下:<dep
- 前言在 上一节 Spring解密 - 默认标签的解析 中,重点分析了 Spring 对默认标签是如何解析的,那么本章继续讲解标签解析,着重讲
- 前言:$是c# 6.0 的语言特性,功能类似string.format(),更方便的地方在于不要像format一样使用索引,可以直接使用变量
- SessionFactory在Hibernate中实际上起到了一个缓冲区的作用 他缓冲了HI
- 1. 实验目的: 使用线程池的时候,有时候需要考虑服务器的最大线程数目和程序最快
- C++编写的一个图书管理系统,供大家参考,具体内容如下2018大一的课设,搬到这纪念一下,共1200多行代码为图书管理人员编写一个图书管理系
- 话不多说,请看代码/// <summary>/// 删除字符串中的中文/// </summary>public st
- Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能。Cookie