历史文章(文章累计450+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
利用Spring扩展点对敏感信息加密解密,一文集齐n多知识点「扩展点实战系列」」- 第447篇
利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇
走进MyBatis源码一探Spring扩展点「知识点多多」「扩展点实战系列」- 第449篇
走进SpringBoot源码吃透Spring扩展点「扩展点实战系列」- 第450篇
5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇
SpringBoot添加外部jar包及打包(亲测有效) - 第452篇
悟纤:师傅,有粉丝留言了。
师傅:说什么了?
悟纤:如果打的是war包,要怎么打包?
师傅:那徒儿觉得呢?
悟纤:应该大差不差呢。
师傅:这个要怎么说呢,从配置上来说,要是要做一些配置的,没人和你说的话,自己摸索还是有一定困难的。
悟纤:那师傅你懂吗?
师傅:To understand or not to understand, that is the question。
悟纤:师傅赶紧的吧,教教我呗。
师傅:那你赶紧调整下状态,马上开始。
悟纤:时刻准备着了~
导读
有粉丝留言:
将Spring Boot打包成war包,对于开发自己,可能都没有想过这个问题吧~需求都是来源于实际的,产品要求、技术领导要求、历史原因等等。
总结下需求:
(1)将Spring Boot项目打包成war包。
(2)将war包部署到web容器。
(3)引入外部jar如何配置?
一、为什要打成war包
1.1 jar与war包的区别
l jar包:直接通过内置 tomcat 运行,不需要额外安装 tomcat。如需修改内置 tomcat 的配置,只需要在SpringBoot 的配置文件中配置。内置 tomcat 没有自己的日志输出,全靠 jar 包应用输出日志。但是比较方便,快速,比较简单。
lwar 包:传统的应用交付方式,需要安装 tomcat,然后放到 webapps 目录下运行 war 包,可以灵活选择tomcat 版本,可以直接修改 tomcat 的配置,有自己的 tomcat 日志输出,可以灵活配置安全策略。相对打成 jar 包来说没那么快速方便。
1.2 为什么要打包成war包的场景
有解决方案,那么就存在解决方案的一些场景或者原因。
(1)共用一个web容器:在某些特殊场景下需要将后台和其他应用共用一个web容器(Tomcat之类)。
(2)方便运维人员维护,修改配置:当我们使用springboot开发时,有的时候需要打war包在外部tomcat部署,方便运维人员维护,但是修改配置文件后重新打包给运维的时候,又需要修改一些配置这样还是不方便维护。
(3)公司旧的技术体系:由于在早期没有SpringBoot时,一些老的项目已经通过Tomcat独立部署war包,并构建了相应的部署体系和闭环。而且对于老的成熟的项目不期望在投入精力去升级和改造,只需要最小大家的保证运行稳定,为了投入和产出的平衡。
(4)通过外部的可配置Web容器(Tomcat)进行项目管理:Spring Boot项目使用了内嵌的Web容器,如果要使用外部的可配置的Web容器,那么打包成war包,再部署到Web容器中。
(5)项目需要集群部署或者进行优化:SpringBoot默认达成jar包,使用SpringBoot构想web应用,默认使用内置的Tomcat,但考虑到项目需要集群部署或者进行优化时,就需要打成war包部署到外部的Tomcat服务器中。
(6)class增量升级:一些客户需要 class 增量升级,虽然 jar 也可以做到,但是过程太过复制。这个时候如果直接打成 war 包,整理升级 class 文件就非常的好办了。
(7)项目中使用了JSP:如果项目中有使用 JSP,那么使用 war 包部署会更方便一些,虽然我们也可以通过配置集成 JSP 通过 jar 包方式运行;新项目的话就不要用 JSP 了。
(8)公司使用的是其它的Web容器:如果公司用的 web 容器不是 Tomcat、Jetty 或undertow,那就只能打成 war 包部署。
二、如何打成war包
打包成war整体思路就是排查web容器依赖,添加maven-war-plugin插件。接下来就使用Tomcat容器给大家做个示范,亲测有效。
在讲解下说明一下环境,避免因为环境的问题,给大家带来不必要的烦恼:
(1)操作系统:Mac OS。
(2)开发工具:IntelliJ IDEA 2022.2.2 (Ultimate Edition)。
(3)JDK版本:1.8。
(4)Spring Boot版本:2.7.6。
(5)Tomcat版本:apache-tomcat-8.5.57。
2.1 pom设置:添加war打包方式
在pom.xml文件, 添加war打包方式:
<packaging>war</packaging>
该配置和<name>节点同级,如下截图所示:
2.2 pom设置:排除SpringBoot内置的tomcat
现在是打包成war包了,那么打包的时候就不需要内嵌web容器了,要排除掉。修改pom.xml文件的spring-boot-starter-web添加属性exclusions:
<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>
2.3 pom设置:添加tomcat容器
你是不是搞错了,前面的步骤不是刚说排除掉吗?这里又要添加进来。是的,你没有看错,打包的时候不需要打包了,但项目开发的时候还是需要使用到了,所以需要重新添加进来,并且将scope设置为provided:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
这里是测试用的,scope设置为provided。
2.4 pom设置:添加war打包插件
在<build> - <plugins>下maven-war-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
说明:failOnMissingWebXml设置为false,让系统忽略缺少WEB-INF的错误。
2.5 pom设置:添加最终打包项目名
在build下添加fileName:
<finalName>package-war-test</finalName>
最终打包成package-war-test.war。当然这个不配置也是打包的,只是打包的war文件是name加上版本号的。
2.6 启动类设置
(1)继承SpringBootServletInitializer
(2)重写其configure方法
package com.example.packagewartest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class PackageWarTestApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(PackageWarTestApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(PackageWarTestApplication.class, args);
}
}
2.7 配置文件:添加content-path
访问tomcat的项目,很多时候是有项目名称的,为了访问地址的统一,可以配置属性content-path,当然这个不配置的话,也不影响打包。
在application.properties添加属性:
server.servlet.context-path=/package-war-test
2.8 maven打包
(1)clean
(2)package
(3)获取targert war包
2.9 部署到tomcat
(1)把war包放在tomcat的webapps目录下。
(2)启动tomcat:bin/startup.sh
(3)localhost+tomcat端口号+项目名+接口,进行访问。
2.10 引入外部jar打包成war包
引入jar,在使用外部jar的方法,重新进行打包部署。
更多@添加外部jar包及打包的知识,关注公众号「SpringBoot」回复关键词[452],查看文章:
《SpringBoot添加外部jar包及打包(亲测有效) - 第452篇》
启动访问接口,报错:
报错信息的意思,就是类早不到,也就是说外部jar并没有被打包进来。
只需要稍微修改下配置,指定资源路径即可:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<webResource>
<directory>${pom.basedir}/libs/</directory>
<targetPath>WEB-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</webResource>
</webResources>
</configuration>
</plugin>
然后再重新打包部署,访问一下:
测试使用的源码如下截图:
总结
总的来说,打包成war包的一个好处,就是把多个项目部署到同一个tomcat下,对tomcat统一配合优化和管理,至于要不要打包成war包看自己的需求,非不要下当然是使用jar的方式了,在Spring Boot2.3的版本还支持了分层jar了,可以自行了解下。
最后对核心步骤做个简单的总结:
(1)如何打包成war包:使用插件maven-war-plugin。
(2)如何将外部jar进行打包:配置属性webResource。
(3)没有属性web.xml文件文件报错:配置属性failOnMissingWebXml为false。
(4)内嵌容器依赖问题:先从starter-web依赖节点排除,然后再添加,并将scope设置为provided。
(5)名称问题:打包名称可以在pom.xml文件设置fileName,项目名称可以在application.properties(yml)中设置context-path。
文章已经写的不能再详细了,如果你还是碰到了问题,那么… 还是有可能的~
\(^o^)/~ 你的小小鼓励,是博主坚持的动力,如果本文你有收获,点个赞再走呗~