前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入Spring Boot (十四):jar/war打包解决方案

深入Spring Boot (十四):jar/war打包解决方案

作者头像
JavaQ
发布2021-01-05 10:05:22
2.1K0
发布2021-01-05 10:05:22
举报
文章被收录于专栏:JavaQJavaQ

最近有位网友通过公众号找到我咨询一个SpringBoot项目打包的问题。

这位朋友说网络上有很多重复、不可用的技术文章,这个倒是事实,更糟糕的一些自媒体为了流量抄来抄去,增加我们查找解决方案的时间成本,我也尝试去搜索了一下“SpringBoot打包”,结果不尽人意,所以,总结了这篇打包解决方案。

基于SpringBoot开发的项目代码可以打包成可执行jar,也可以打包成war,这个视不同需求而定,下面以SpringBoot2.4.0版本为例,分别列举了不同使用方式下的jar和war打包操作。

构建可执行jar包

SpringBoot推荐将应用系统构建成可执行jar包,使用内置应用服务器运行项目代码。

继承spring-boot-starter-parent

如果项目配置了pom继承spring-boot-starter-parent,就像下面这样:

代码语言:javascript
复制
<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.4.0</version></parent>

此时要把项目代码打包成jar,需要在pom中配置packaging=jar,就是下面这样:

代码语言:javascript
复制
<packaging>jar</packaging>

接着,使用finalName标签配置最终jar包的名字,然后配置spring-boot-maven-plugin插件,例如如下配置:

代码语言:javascript
复制
    <build>        <finalName>demo</finalName>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build>

以上就是pom中的配置了,接下来执行jar打包操作,如果使用IDEA图形化工具打包,双击执行Maven窗口下Lifecycle中的package,即执行打jar包。

如果想通过执行mvn指令打jar,需要cd到源码根目录,即pom.xml所在的目录,然后执行mvn clean package,即执行打jar包。

不继承spring-boot-starter-parent

如果项目pom文件没有继承spring-boot-starter-parent,要想将项目代码构建成可执行jar包,同样需要在pom中配置packaging=jar,就是下面这样:

代码语言:javascript
复制
<packaging>jar</packaging>

接着,使用finalName标签配置最终jar包的名字,然后配置spring-boot-maven-plugin插件,这里不一样的是需要配置goal=repackage,例如如下配置:

代码语言:javascript
复制
    <build>        <finalName>demo</finalName>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <version>2.4.0</version>                <executions>                    <execution>                        <goals>                            <goal>repackage</goal>                        </goals>                    </execution>                </executions>            </plugin>        </plugins>    </build>

以上就是pom中的配置了,接下来执行jar打包操作,如果使用IDEA图形化工具打包,双击执行Maven窗口下Lifecycle中的package,即执行打jar包;如果想通过执行mvn指令打jar,需要cd到源码根目录,即pom.xml所在的目录,然后执行mvn clean package,即执行打jar包。

构建可部署war包

如果需要将项目代码构建成war包,可参考如下两个不同的方式。不过需要注意,对于web应用,SpringBoot2.4使用Servlet3,所以war包需要部署在支持Servlet3的应用服务器上,例如tomcat8.0及以上版本。

继承spring-boot-starter-parent

如果配置了项目pom继承spring-boot-starter-parent,就像下面这样:

代码语言:javascript
复制
<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.4.0</version></parent>

此时要把项目代码打包成jar,需要在pom中配置packaging=war,就是下面这样:

代码语言:javascript
复制
<packaging>war</packaging>

接着,使用finalName标签配置最终war包的名字,然后配置spring-boot-maven-plugin插件,例如如下配置:

代码语言:javascript
复制
    <build>        <finalName>demo</finalName>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build>

以上就是pom中的配置了,接下来执行war打包操作,如果使用IDEA图形化工具打包,双击执行Maven窗口下Lifecycle中的package,即执行打war包;如果想通过执行mvn指令打war,需要cd到源码根目录,即pom.xml所在的目录,然后执行mvn clean package,即执行打war包。

不继承spring-boot-starter-parent

如果项目pom文件没有继承spring-boot-starter-parent,要想将项目代码构建成war包,同样需要在pom中配置packaging=war,就是下面这样:

代码语言:javascript
复制
<packaging>war</packaging>

接着,使用finalName标签配置最终war包的名字,然后配置构建war包需要使用到的插件,spring-boot-maven-plugin中同样需要配置goal=repackage,例如如下配置:

代码语言:javascript
复制
 <build>    <finalName>demo</finalName>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-antrun-plugin</artifactId>            <version>1.8</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-assembly-plugin</artifactId>            <version>3.3.0</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-clean-plugin</artifactId>            <version>3.1.0</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-compiler-plugin</artifactId>            <version>3.8.1</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-dependency-plugin</artifactId>            <version>3.1.2</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-deploy-plugin</artifactId>            <version>2.8.2</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-enforcer-plugin</artifactId>            <version>3.0.0-M3</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-failsafe-plugin</artifactId>            <version>2.22.2</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-help-plugin</artifactId>            <version>3.2.0</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-install-plugin</artifactId>            <version>2.5.2</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-invoker-plugin</artifactId>            <version>3.2.1</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-jar-plugin</artifactId>            <version>3.2.0</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-javadoc-plugin</artifactId>            <version>3.2.0</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-resources-plugin</artifactId>            <version>3.2.0</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-shade-plugin</artifactId>            <version>3.2.4</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-source-plugin</artifactId>            <version>3.2.1</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-surefire-plugin</artifactId>            <version>2.22.2</version>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-war-plugin</artifactId>            <version>3.3.1</version>        </plugin>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <version>2.4.0</version>            <executions>                <execution>                    <goals>                        <goal>repackage</goal>                    </goals>                </execution>            </executions>        </plugin>    </plugins></build>

以上配置中的插件版本号参考自SpringBoot2.4.0中的spring-boot-dependencies-2.4.0.pom,它是spring-boot-starter-parent的父文件。

以上就是pom中的配置了,接下来执行war打包操作,如果使用IDEA图形化工具打包,双击执行Maven窗口下Lifecycle中的package,即执行打war包;如果想通过执行mvn指令打war,需要cd到源码根目录,即pom.xml所在的目录,然后执行mvn clean package,即执行打war包。

小结

从上述操作可以看到,是否继承spring-boot-starter-parent,打包配置还是有些不同的。因为spring-boot-starter-parent pom.xml中已经帮我们管理好了打包需要用到的spring-boot-maven-plugin插件和它需要依赖的其它插件,所以通过继承可以直接使用spring-boot-maven-plugin。有时,我们的项目有自己的parent pom.xml,此时没有继承spring-boot-starter-parent,那么如果还要想使用spring-boot-maven-plugin插件,就需要自定义管理它所依赖的maven插件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构建可执行jar包
    • 继承spring-boot-starter-parent
      • 不继承spring-boot-starter-parent
      • 构建可部署war包
        • 继承spring-boot-starter-parent
          • 不继承spring-boot-starter-parent
          • 小结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档