springboot 项目打包成war用tomcat 运行好还是打包成jar直接启动好?

1、springboot 项目打包成war用tomcat 运行好还是打包成jar直接启动好? 2、看到有人说“spring boot打的jar包叫胖j…
关注者
12
被浏览
26,918

9 个回答

历史文章(文章累计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>