• 深入Spring Boot :打包解决方案


    最近有位网友私信我咨询一个SpringBoot项目打包的问题。

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

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

    构建可执行jar包

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

    继承 spring-boot-starter-parent

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

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

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

    以上就是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,就是下面这样:

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

    以上就是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,就像下面这样:

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

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

    以上就是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,就是下面这样:

    接着,使用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插件。

  • 相关阅读:
    第136篇 库合约
    详解:进程程序替换
    python 如何获取url的名称
    13.1.X:ByteScout PDF Extractor SDK
    HSIC Bottleneck的C++程序实现
    设计资讯 | 巴黎 2024 年奥运会“另一个自我”以 DAB 汽车定制电动摩托车的形式亮相
    在北京多有钱能称为富
    MySQL 9.0创新版发布!功能又进化了!
    (undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵
    关于 Cesium 的笔记 (小白学习哈)
  • 原文地址:https://blog.csdn.net/AS011x/article/details/126617187