SpringBoot引入外部jar包,项目打包成war包发布(亲测有效) - 第453篇

历史文章(文章累计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;@SpringBootApplicationpublic 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^)/~ 你的小小鼓励,是博主坚持的动力,如果本文你有收获,点个赞再走呗~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟纤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值