小言_互联网的博客

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

256人阅读  评论(0)

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

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

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

构建可执行jar包

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

继承spring-boot-starter-parent

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


   
  1. <parent>
  2. <groupId>org.springframework.boot </groupId>
  3. <artifactId>spring-boot-starter-parent </artifactId>
  4. <version>2.4.0 </version>
  5. </parent>

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

<packaging>jar</packaging>

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


   
  1. <build>
  2. <finalName>demo </finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot </groupId>
  6. <artifactId>spring-boot-maven-plugin </artifactId>
  7. </plugin>
  8. </plugins>
  9. </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,就是下面这样:

<packaging>jar</packaging>

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


   
  1. <build>
  2. <finalName>demo </finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot </groupId>
  6. <artifactId>spring-boot-maven-plugin </artifactId>
  7. <version>2.4.0 </version>
  8. <executions>
  9. <execution>
  10. <goals>
  11. <goal>repackage </goal>
  12. </goals>
  13. </execution>
  14. </executions>
  15. </plugin>
  16. </plugins>
  17. </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,就像下面这样:


   
  1. <parent>
  2. <groupId>org.springframework.boot </groupId>
  3. <artifactId>spring-boot-starter-parent </artifactId>
  4. <version>2.4.0 </version>
  5. </parent>

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

<packaging>war</packaging>

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


   
  1. <build>
  2. <finalName>demo </finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot </groupId>
  6. <artifactId>spring-boot-maven-plugin </artifactId>
  7. </plugin>
  8. </plugins>
  9. </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,就是下面这样:

<packaging>war</packaging>

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


   
  1. <build>
  2. <finalName>demo </finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.apache.maven.plugins </groupId>
  6. <artifactId>maven-antrun-plugin </artifactId>
  7. <version>1.8 </version>
  8. </plugin>
  9. <plugin>
  10. <groupId>org.apache.maven.plugins </groupId>
  11. <artifactId>maven-assembly-plugin </artifactId>
  12. <version>3.3.0 </version>
  13. </plugin>
  14. <plugin>
  15. <groupId>org.apache.maven.plugins </groupId>
  16. <artifactId>maven-clean-plugin </artifactId>
  17. <version>3.1.0 </version>
  18. </plugin>
  19. <plugin>
  20. <groupId>org.apache.maven.plugins </groupId>
  21. <artifactId>maven-compiler-plugin </artifactId>
  22. <version>3.8.1 </version>
  23. </plugin>
  24. <plugin>
  25. <groupId>org.apache.maven.plugins </groupId>
  26. <artifactId>maven-dependency-plugin </artifactId>
  27. <version>3.1.2 </version>
  28. </plugin>
  29. <plugin>
  30. <groupId>org.apache.maven.plugins </groupId>
  31. <artifactId>maven-deploy-plugin </artifactId>
  32. <version>2.8.2 </version>
  33. </plugin>
  34. <plugin>
  35. <groupId>org.apache.maven.plugins </groupId>
  36. <artifactId>maven-enforcer-plugin </artifactId>
  37. <version>3.0.0-M3 </version>
  38. </plugin>
  39. <plugin>
  40. <groupId>org.apache.maven.plugins </groupId>
  41. <artifactId>maven-failsafe-plugin </artifactId>
  42. <version>2.22.2 </version>
  43. </plugin>
  44. <plugin>
  45. <groupId>org.apache.maven.plugins </groupId>
  46. <artifactId>maven-help-plugin </artifactId>
  47. <version>3.2.0 </version>
  48. </plugin>
  49. <plugin>
  50. <groupId>org.apache.maven.plugins </groupId>
  51. <artifactId>maven-install-plugin </artifactId>
  52. <version>2.5.2 </version>
  53. </plugin>
  54. <plugin>
  55. <groupId>org.apache.maven.plugins </groupId>
  56. <artifactId>maven-invoker-plugin </artifactId>
  57. <version>3.2.1 </version>
  58. </plugin>
  59. <plugin>
  60. <groupId>org.apache.maven.plugins </groupId>
  61. <artifactId>maven-jar-plugin </artifactId>
  62. <version>3.2.0 </version>
  63. </plugin>
  64. <plugin>
  65. <groupId>org.apache.maven.plugins </groupId>
  66. <artifactId>maven-javadoc-plugin </artifactId>
  67. <version>3.2.0 </version>
  68. </plugin>
  69. <plugin>
  70. <groupId>org.apache.maven.plugins </groupId>
  71. <artifactId>maven-resources-plugin </artifactId>
  72. <version>3.2.0 </version>
  73. </plugin>
  74. <plugin>
  75. <groupId>org.apache.maven.plugins </groupId>
  76. <artifactId>maven-shade-plugin </artifactId>
  77. <version>3.2.4 </version>
  78. </plugin>
  79. <plugin>
  80. <groupId>org.apache.maven.plugins </groupId>
  81. <artifactId>maven-source-plugin </artifactId>
  82. <version>3.2.1 </version>
  83. </plugin>
  84. <plugin>
  85. <groupId>org.apache.maven.plugins </groupId>
  86. <artifactId>maven-surefire-plugin </artifactId>
  87. <version>2.22.2 </version>
  88. </plugin>
  89. <plugin>
  90. <groupId>org.apache.maven.plugins </groupId>
  91. <artifactId>maven-war-plugin </artifactId>
  92. <version>3.3.1 </version>
  93. </plugin>
  94. <plugin>
  95. <groupId>org.springframework.boot </groupId>
  96. <artifactId>spring-boot-maven-plugin </artifactId>
  97. <version>2.4.0 </version>
  98. <executions>
  99. <execution>
  100. <goals>
  101. <goal>repackage </goal>
  102. </goals>
  103. </execution>
  104. </executions>
  105. </plugin>
  106. </plugins>
  107. </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插件。

往期推荐

Java开发人员必知的常用类库,这些你都知道吗?

聊一聊Redis官方置顶推荐的Java客户端Redisson

我画了25张图展示线程池工作原理和实现原理,原创干货,建议先收藏再阅读

Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理

面试被问为什么使用Spring Boot?答案好像没那么简单

Spring声明式事务处理的实现原理,来自面试官的穷追拷问

没使用加号拼接字符串,面试官竟然问我为什么

面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的

都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问

Java注解是如何玩转的,面试官和我聊了半个小时

学之多,而后知之少!朋友们点【在看】是我持续更新的最大动力!


转载:https://blog.csdn.net/tianruirui/article/details/111503293
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场