专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  弃用 ... ·  昨天  
芋道源码  ·  SpringBoot ... ·  2 天前  
芋道源码  ·  一个注解完美实现分布式锁 ·  2 天前  
芋道源码  ·  疯传Java界,堪称最强! ·  2 天前  
芋道源码  ·  软考重磅消息!刚刚明确!恭喜2025年考生! ·  2 天前  
51好读  ›  专栏  ›  芋道源码

SpringBoot 多种生产打包方式详解

芋道源码  · 公众号  · Java  · 2025-01-22 09:36

正文

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、ERPCRMAI 大模型等等功能:

  • Boot 多模块架构:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服务架构:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本 

来源:juejin.cn/post/
7442154802832916530


生产上发布 Spring Boot 项目时,流程颇为繁琐且低效。但凡代码有一丁点改动,就得把整个项目重新打包部署,耗时费力不说,生成的 JAR 包还特别臃肿,体积庞大。每次更新项目,光是上传这大文件就得花费不少时间,严重影响工作节奏。

为解决这一痛点,我打算把依赖库以及配置文件(lib 文件夹下的那些 jar 包,还有config下的applacation.yml等文件)从项目主体里剥离出来,后续部署时,只需发布核心代码就行,这样既能加快部署速度,又能减轻文件传输负担,让项目更新变得轻松便捷

方法一 插件spring-boot-maven-plugin

1. 项目应用的配置文件排除 统一打包到config目录下

利用springboot中resource插件来排除配置,并统一打包到config目录下

<resources>
  <resource>
      <directory>src/main/resourcesdirectory>
       
       <filtering>truefiltering>
       
      <targetPath>${project.build.directory}/configtargetPath>
      <includes>
      
         <include>**/*.propertiesinclude>
         <include>**/*.ymlinclude>
         <include>**/*.xmlinclude>
     <include>mapper/*.xmlinclude>
      
   includes>
  resource>
resources>

2. 把我们写代码打包可执行jar,并排除依赖jar包


  org.springframework.boot
  spring-boot-maven-plugin
  
   
    
     -Dfile.encoding=UTF-8
     ZIP
     
     
     
        
             no-exists-jar
            non-exists-jar
         

      

  

  
    
         
         
           repackage
       

    

  


3. 配置依赖的jar包 统一打包lib目录


<plugin>
   <groupId>org.apache.maven.pluginsgroupId>
   <artifactId>maven-dependency-pluginartifactId>
   <executions>
   <execution>
      <id>copy-dependenciesid>
      <phase>packagephase>
      <goals>
         <goal>copy-dependenciesgoal>
      goals>
     <configuration>
          <outputDirectory>${project.build.directory}/liboutputDirectory>
          <excludeTransitive>falseexcludeTransitive>
          <stripVersion>falsestripVersion>
          <includeScope>runtimeincludeScope>
      configuration>
    execution>
  executions>
plugin>

打包后目录结构,如下图所示

执行命令 java -jar -Dloader.path=./lib -jar xxx.jar

注意 springboot启动时候会优先读取config目录下配置文件 所以这里不用指定-Dspring.config.location=XX.yml文件

注意 例如日志文件配置以及mybits等配置文件 可以配成绝对路径 如下所示:

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

方法二 使用maven-jar-plugin插件实现

1. 使用插件maven-resources-plugin处理配置文件打包到config目录

<plugin>
    <groupId>org.apache.maven.pluginsgroupId>
    <artifactId>maven-resources-pluginartifactId>
    <configuration>
       <encoding>UTF-8encoding>
    configuration>
   <executions>
      <execution>
          <id>copy-dependenciesid>
          <phase>packagephase>
          <goals>
             <goal>copy-resourcesgoal>
          goals>
  <configuration>

      <outputDirectory>${project.build.directory}/twin-web/configoutputDirectory>
      <resources>
      <resource>
      <directory>src/main/resourcesdirectory>
      resource>
      resources>
     configuration>
  execution>
executions>
plugin>

2. 使用maven-jar-plugin 打包可执行jar 并排除依赖

<plugin>
   <groupId>org.apache.maven.pluginsgroupId>
   <artifactId>maven-jar-pluginartifactId>
   <configuration>
      <outputDirectory>
          
          ${project.build.directory}/twin-web/
       outputDirectory>
      <archive>
        <addMavenDescriptor>falseaddMavenDescriptor>
       <manifest>
             <addClasspath>trueaddClasspath>
         
           <classpathPrefix>./libs/classpathPrefix>
         
            <mainClass>com.keqing.twinweb.TwinWebApplicationmainClass>
        manifest>
        <manifestEntries>
          
          <Class-Path>./config/Class-Path>
      manifestEntries>
archive>

     <excludes>
         <exclude>*.ymlexclude>
         <exclude>mapper/**exclude>
         <exclude>*.xmlexclude>
     excludes>
  configuration>
plugin>

3. 使用maven-dependency-plugin 打包libs目录下

<plugin>
   <groupId>org.apache.maven.pluginsgroupId>
   <artifactId>maven-dependency-pluginartifactId>
   <executions>
   <execution>
      <id>copy-dependenciesid>
      <phase>packagephase>
      <goals>
         <goal>copy-dependenciesgoal>
      goals>
     <configuration>
          <outputDirectory>${project.build.directory}/twin-web/libsoutputDirectory>
          <excludeTransitive>falseexcludeTransitive>
          <stripVersion>falsestripVersion>
          <includeScope>runtimeincludeScope>
      configuration>
    execution>
  executions>
plugin>

使用package打包后的目录

查看自己打包后jar目录,注意这种打包方式弊端,按照一定约定格式规范固定了,一旦依赖jar包(包括配置文件目录等)发生变化就必须重新打包

启动程序java -jar xxx.jar

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

方式三 使用maven-assembly-plugin打包

maven-assembly-plugin 是 Maven 中的一个插件,它允许用户将项目的输出以及依赖、模块、站点文档和其他文件打包成一个可发布的格式,例如 zip、tar.gz、jar 等。以下是使用 maven-assembly-plugin 的一些优势:

  • 自定义打包格式: maven-assembly-plugin 允许你通过定义描述符文件(descriptor)来完全自定义打包的内容和格式。你可以选择包含或排除特定的文件和目录。
  • 一键打包: 通过一个简单的 Maven 命令,你可以创建一个包含所有必需依赖的单一归档文件,这使得分发和部署变得非常简单。
  • 多环境支持: 可以为不同的环境(开发、测试、生产)创建不同的打包配置,使得环境迁移更加容易。
  • 依赖管理: 插件会自动处理项目依赖,将它们打包到最终的归档文件中,无需手动管理。
  • 模块化项目支持: 对于多模块项目,maven-assembly-plugin 可以将所有模块的输出合并到一个归档文件中。
  • 预配置的描述符: 插件提供了一些预定义的描述符,如 bin、jar-with-dependencies 等,可以直接使用,无需自定义。
  • 灵活性: 你可以通过修改描述符文件来调整打包行为,以适应不同的需求。
  • 集成性: maven-assembly-plugin 与 Maven 生态系统紧密集成,可以与其他 Maven 插件协同工作。
  • 文档和社区支持: 由于 maven-assembly-plugin 是 Maven 的一部分,因此有广泛的文档和社区支持。

1. 项目应用的配置文件排除

<resources>
  <resource>
         <directory>src/main/resourcesdirectory>
             
          <filtering>truefiltering>
         <includes>
             
            <include>**/*.propertiesinclude>
            <include>**/*.ymlinclude>
            <include>**/*.xmlinclude>
           <include>mapper/*.xmlinclude>
        
        includes>
   resource>
resources>

2. 配置spring-boot-maven-plugin

<plugin>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-maven-pluginartifactId>
   <configuration>
    
        
        <jvmArguments>-Dfile.encoding=UTF-8jvmArguments>
        <layout>ZIPlayout>
           
       <includes>
        
          <include>
          <groupId>no-exists-jargroupId>
          <artifactId>non-exists-jarartifactId>
          include>
      includes>
   configuration>
   <executions>
         <execution>
           <goals>
                 
              <goal>repackagegoal>
          goals>
      execution>
  executions>
plugin>

3. 引入springboot里约定maven-assembly-plugin

<plugin>
    <artifactId>maven-assembly-pluginartifactId>
    <configuration>

      <appendAssemblyId>falseappendAssemblyId>
      <descriptors>
      
        <descriptor>assembly.xmldescriptor>
      descriptors>
  configuration>
<executions>
   <execution>
   <id>make-assemblyid>
   <phase>packagephase>
   <goals>
          <goal>singlegoal>
    goals>
    execution>
  executions>
plugin>

配置assembly.xml文件

<assembly>
   
    <id>make-assemblyid>
    
   <formats>
      <format>tar.gzformat>
      <format>zipformat>
   formats>
     
   <includeBaseDirectory>trueincludeBaseDirectory>
     
  <fileSets>
   
    
    
    <fileSet>
     
       <lineEnding>unixlineEnding>
       <directory>${basedir}/bindirectory>
       <outputDirectory>${file.separator}outputDirectory>
       <fileMode>0755fileMode>
       <includes>
         <include>**.shinclude>
         <include>**.batinclude>
      includes>
   fileSet>

   <fileSet>
      <directory>${basedir}/src/main/resourcesdirectory>
      <outputDirectory>configoutputDirectory>
      <fileMode>0644fileMode>
      <includes>
           <include>*.propertiesinclude>
           <include>*.ymlinclude>
          <include>*.xmlinclude>
         <include>mapper/*.xmlinclude>
      includes>
   fileSet>
   
    <fileSet>
      <directory>${project.build.directory}directory>
      <outputDirectory>${file.separator}outputDirectory>
      <includes>
          <include>*.jarinclude>
      includes>
   fileSet>
 fileSets>

<dependencySets>
   <dependencySet>
     <unpack>falseunpack>
    <useProjectArtifact>trueuseProjectArtifact>
    <outputDirectory>liboutputDirectory>
    <scope>providedscope>
  dependencySet>
  <dependencySet>
      <unpack>falseunpack>
      <useProjectArtifact>trueuseProjectArtifact>
      <outputDirectory>liboutputDirectory>
      <scope>systemscope>
  dependencySet>
  <dependencySet>
     <unpack>falseunpack>
     <useProjectArtifact>trueuseProjectArtifact>
     <outputDirectory>liboutputDirectory>
     <scope>runtimescope>
  dependencySet>
dependencySets>
assembly>

打包后目录

解压zip目录查看

使用命令启动项目java -jar -Dloader.path=./lib -jar xxx.jar



欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)