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 包外部,作为外部化配置供运行时加载。 |
如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~


浙公网安备 33010602011771号