springboo打包--微服务打包

Spring Boot 微服务项目中,常见结构如下:

text 复制代码
root
 ├─ service-auth
 ├─ service-gateway
 ├─ service-system
 ├─ service-xxx
 └─ pom.xml(父工程)

每个模块都是一个 可独立启动的 Spring Boot 应用 ,在打包过程中,各自的包都在各模块的 target/ 下,统一部署需要手动逐个找到所有的jar包,比较繁琐且低效。希望能有一套更高效且不影响微服务独立性的方案。


二、推荐方案总览

  1. 父 POM 统一汇总
  2. 使用 Assembly 插件生成发布包
  3. 脚本统一收集
  4. 每个模块自己 copy

三、方案一:父工程统一聚合微服务 Jar(推荐)

核心思路

  • 每个微服务 正常打 jar
  • 父工程在 package 阶段:
    • 自动收集所有子模块 jar
    • 汇总到统一目录

3.1 统一输出目录定义

父 pom.xml 中定义:

xml 复制代码
<properties>
    <dist.dir>${project.build.directory}/dist</dist.dir>
</properties>

3.2 使用 maven-dependency-plugin 聚合

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-all-modules</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${dist.dir}</outputDirectory>
                        <includeTypes>jar</includeTypes>
                        <stripVersion>true</stripVersion>
                        <overWriteReleases>true</overWriteReleases>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
配置说明
参数 作用
outputDirectory 汇总目录
includeTypes 只拷贝 jar
stripVersion 去掉版本号,利于部署
overWrite 防止多次构建残留

3.3 示例

bash 复制代码
mvn clean package -DskipTests

生成:

text 复制代码
target/dist/
├─ analyzer-auth.jar
├─ analyzer-gateway.jar
├─ analyzer-modules-system.jar
├─ analyzer-special-xxx.jar
└─ ...

只需要关注 target/dist就可以

3.4 为什么可以在父工程统一收集 Jar?

Maven 构建顺序保证

text 复制代码
父工程
 ├─ 子模块 A(jar)
 ├─ 子模块 B(jar)
 └─ 子模块 C(jar)

当执行:

bash 复制代码
mvn package

Maven 会:

  1. 先构建所有子模块
  2. 再执行父工程的 package 阶段插件
    因此在父工程 package 阶段:
  • 所有子模块 jar 已经生成
  • 父工程可以进行:
    • copy
    • 聚合

四、方案二:使用 Assembly 生成发布包

4.1 Assembly 描述文件(assembly.xml)

xml 复制代码
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3">
    <id>dist</id>
    <formats>
        <format>tar.gz</format>
    </formats>

    <baseDirectory>security-analyzer</baseDirectory>

    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/dist</directory>
            <outputDirectory>/apps</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>script</directory>
            <outputDirectory>/script</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

4.2 父 POM 绑定 Assembly 插件

xml 复制代码
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

4.3 示例

text 复制代码
target/security-analyzer-dist.tar.gz

解压后:

text 复制代码
security-analyzer/
 ├─ apps/
 │   ├─ auth.jar
 │   ├─ gateway.jar
 │   └─ system.jar
 ├─ script/  ## 配置的 fileSet
 │   ├─ start.sh
 │   └─ stop.sh
 └─ README.md

五、方案三:统一收集

5.1 Jenkins Shell 示例

bash 复制代码
mkdir -p dist
find . -path "*/target/*.jar" -name "*.jar" -exec cp {} dist/ \;

优缺点

优点 缺点
不改 pom 构建逻辑不在代码
快速生效 可能导致本地与其他位置不一致
适合存量项目 可维护性较差

六、方案四:子模块自行 Copy 到公共目录(不推荐)

不推荐原因:

  • 模块职责混乱
  • 父工程失去发布控制权
  • 模块被复用时易出问题
  • 不符合微服务自治原则
    子模块单独构建,或被其他项目复用时,配置立即失效或产生副作用

6.1 方案四的核心思路

在子模块中:在 package 阶段,将自身 jar copy 到一个 公共目录

6.2 示例配置(maven-resources-plugin)

子模块 pom.xml 中:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.3.1</version>
            <executions>
                <execution>
                    <id>copy-jar-to-dist</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.parent.basedir}/dist</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.build.directory}</directory>
                                <includes>
                                    <include>*.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
相关推荐
jayaccc16 小时前
微前端架构实战全解析
前端·架构
roman_日积跬步-终至千里16 小时前
【大数据架构-数据中台(2)】数据中台建设与架构:从战略到落地的完整方法论
大数据·架构
颜淡慕潇17 小时前
Spring Boot 3.3.x、3.4.x、3.5.x 深度对比与演进分析
java·后端·架构
gaize121317 小时前
服务器分类及区别划分!多样化服务器用途体系架构及层次分类
运维·服务器·架构
小二·17 小时前
微前端架构完全指南:qiankun 与 Module Federation 双方案深度对比(Vue 3 + TypeScript)
前端·架构·typescript
DKunYu17 小时前
7.SpringCloudConfig
spring cloud·微服务
roman_日积跬步-终至千里18 小时前
【大数据架构-数据中台(1)】解码数据中台:从概念到认知
大数据·架构·dubbo
狼爷19 小时前
Saga 分布式事务模式详解
架构
oMcLin19 小时前
如何在 Red Hat Linux 8 上实现 Kubernetes 自定义资源管理器(CRD)扩展,支持微服务架构
linux·架构·kubernetes
一条咸鱼_SaltyFish20 小时前
[Day10] contract-management初期开发避坑指南:合同模块 DDD 架构规划的教训与调整
开发语言·经验分享·微服务·架构·bug·开源软件·ai编程