Fork me on GitHub

Maven打包(yml在包外)

Maven构建配置解析

一、构建产物总览

target/
├── application.yml ← ❶ 外部配置文件(JAR 外)
├── application-dev.yml ← ❶ 外部配置文件(JAR 外)
├── application-prod.yml ← ❶ 外部配置文件(JAR 外)
├── install.sh ← ❶ 安装脚本(JAR 外)
├── wvp-pro-2.7.4-06220848.jar ← ❷ 可执行 Fat JAR(内部无 yml)
└── wvp-pro-2.7.4-06220848.jar.original ← ❸ 原始 JAR(内部无 yml)
产物 是否包含 yml 能否运行
*.jar(Fat JAR) 不含 ✅ 可以,依赖外部 yml
*.jar.original(原始 JAR) 不含 ❌ 不可运行
外部 application*.yml ✅ 独立文件 供 Fat JAR 启动时加载

二、pom.xml打包构建配置

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- ===== 项目坐标 ===== -->
    <groupId>com.genersoft</groupId>
    <artifactId>wvp-pro</artifactId>
    <version>2.7.4</version>
    <packaging>${project.packaging}</packaging>   <!-- 由 profile 控制 jar/war -->

    <!-- ===== 构建属性 ===== -->
    <properties>
        <!-- 时间戳格式:月日时分 → 用于 JAR 文件名后缀 -->
        <maven.build.timestamp.format>MMddHHmm</maven.build.timestamp.format>
        <java.version>21</java.version>
    </properties>

    <!-- ===== Profile:控制打包类型 ===== -->
    <profiles>
        <profile>
            <id>jar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <project.packaging>jar</project.packaging>
            </properties>
        </profile>
        <profile>
            <id>war</id>
            <properties>
                <project.packaging>war</project.packaging>
            </properties>
        </profile>
    </profiles>

    <!-- ===== 构建配置 ===== -->
    <build>
        <!-- 最终文件名:wvp-pro-2.7.4-06220848.jar -->
        <finalName>${project.artifactId}-${project.version}-${maven.build.timestamp}</finalName>

        <plugins>
            <!-- ============================================================ -->
            <!-- 1. Spring Boot 打包插件:生成可执行 Fat JAR                   -->
            <!--    流程:将原始 JAR 重命名为 .original,然后加入依赖重新打包  -->
            <!--    注意:它基于原始 JAR 的内容,原始 JAR 缺什么,它也就缺什么 -->
            <!-- ============================================================ -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.4.10</version>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                    <executable>true</executable>
                </configuration>
            </plugin>

            <!-- ============================================================ -->
            <!-- 2. Maven 编译插件:指定 Java 21,配置 Lombok 注解处理器       -->
            <!-- ============================================================ -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.14.0</version>
                <configuration>
                    <source>21</source>
                    <target>21</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.38</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

            <!-- ============================================================ -->
            <!-- 3. 测试跳过插件:构建时跳过单元测试                           -->
            <!-- ============================================================ -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.2.5</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>

            <!-- ============================================================ -->
            <!-- 4. JAR 打包插件 ★★★ 核心关键 ★★★                              -->
            <!--    功能:决定原始 JAR 里包含哪些文件                           -->
            <!--    影响:排除的文件 → 原始 JAR 没有 → Fat JAR 也没有          -->
            <!--    这就是你截图里 JAR 包内没有 yml 的根本原因                 -->
            <!-- ============================================================ -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.4.2</version>
                <configuration>
                    <excludes>
                        <exclude>**/配置详情.yml</exclude>
                        <exclude>**/application.yml</exclude>
                        <exclude>**/application-*.yml</exclude>
                        <exclude>**/local.jks</exclude>
                        <exclude>**/install.sh</exclude>
                    </excludes>
                </configuration>
            </plugin>

            <!-- ============================================================ -->
            <!-- 5. 资源复制插件:把配置文件复制一份到 target 根目录(JAR 外)  -->
            <!--    目的:部署时 JAR 包与配置文件并列,便于外部覆盖配置         -->
            <!--    注意:这仅复制外部副本,不影响 JAR 包内部内容               -->
            <!-- ============================================================ -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <includes>
                                        <include>application.yml</include>
                                        <include>application-*.yml</include>
                                        <include>install.sh</include>
                                    </includes>
                                </resource>
                            </resources>
                            <outputDirectory>${project.build.directory}</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <!-- ============================================================ -->
        <!-- 资源目录配置:决定哪些文件进入 target/classes(编译目录)       -->
        <!-- 注意:classes 的内容会被 Spring Boot 打包进 JAR,               -->
        <!--       但如果原始 JAR 排除了某些文件,这里的内容也白搭           -->
        <!-- ============================================================ -->
        <resources>
            <!-- src/main/resources 下所有文件 → classes -->
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <!-- src/main/java 下的 XML(如 MyBatis 映射)→ classes -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

三、构建流程全貌

┌─────────────────────────────────────────────────────────────────────────────┐
│                              mvn package                                    │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 步骤1:编译                                                                 │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ maven-compiler-plugin + <resources>                                     │ │
│ │ → 生成 target/classes/(包含 .class 和所有资源,包括 yml)             │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 步骤2:打原始 JAR                                                          │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ maven-jar-plugin 读取 target/classes/                                  │ │
│ │ 根据 <excludes> 排除:application*.yml、local.jks、install.sh          │ │
│ │ → 生成 wvp-pro-2.7.4-06220848.jar(原始 JAR,不含 yml)               │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 步骤3:Spring Boot 重打包                                                   │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ spring-boot-maven-plugin:                                              │ │
│ │ ① 将原始 JAR 重命名为 .original 备份                                   │ │
│ │ ② 读取原始 JAR 内容(不含 yml)                                       │ │
│ │ ③ 加入所有第三方依赖                                                   │ │
│ │ ④ 重新打包成可执行 Fat JAR                                              │ │
│ │ → 生成 wvp-pro-2.7.4-06220848.jar(Fat JAR,依然不含 yml)            │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 步骤4:复制外部配置(package 阶段)                                         │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ maven-resources-plugin:                                                │ │
│ │ 把 src/main/resources 下的 yml 和 install.sh 复制到 target/ 根目录     │ │
│ │ → target/application.yml、application-dev.yml、install.sh 等           │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
                                      │
                                      ▼
                           ┌─────────────────────┐
                           │   构建完成!         │
                           │ target/ 目录下:     │
                           │ ① Fat JAR(无 yml)  │
                           │ ② .original(备份)  │
                           │ ③ 外部 yml 文件     │
                           └─────────────────────┘

四、Spring Boot 启动时配置加载顺序

优先级从高到低:
① 当前目录下的 config/ 子目录中的 application.yml
② 当前目录下的 application.yml         ← 你的 yml 在这里!
③ classpath 下的 config/ 包中的 application.yml
④ classpath 根目录下的 application.yml ← JAR 内部没有

JAR 包和 application.yml 放在同一目录,启动时 Spring Boot 优先加载外部 yml,所以即使 JAR 内部没有配置,也能正常运行。

五、总结

配置 作用 对 yml 的影响
maven-jar-plugin 排除特定文件 决定 JAR 内没有 yml
maven-resources-plugin 复制配置到外部 决定 JAR 外有 yml 副本
<resources> 编译资源到 classes 提供编译源,但被 maven-jar-plugin 覆盖
spring-boot-maven-plugin 重打包成可执行 JAR 继承原始 JAR 的内容,所以也没有 yml
根本原因:maven-jar-plugin 排除了 yml,Spring Boot 重打包时基于原始 JAR,所以最终 Fat JAR 内部没有 yml。配置文件只存在于 JAR 包外部,作为外部化配置供运行时加载。
posted @ 2026-06-23 21:26  秋夜雨巷  阅读(3)  评论(0)    收藏  举报