# my-demo-app
**Repository Path**: zhouzq2046/my-demo-app
## Basic Information
- **Project Name**: my-demo-app
- **Description**: 一个基于 Spring Boot 的 Maven 多模式打包示例项目,展示了如何构建灵活、可维护的 Java 应用部署方案。
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-07
- **Last Updated**: 2026-04-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Product README - My Demo App
> **👥 目标读者**: 开发人员、技术爱好者
> **📖 本文档内容**: 项目简介、快速开始、开发指南
基于 Spring Boot 的 Maven 多模式打包示例项目。
## ✨ 核心特性
- 🚀 **双模式打包** - Thin(瘦身)和 Fat(胖包)两种模式,通过 Maven Profile 灵活切换
- 🎯 **Profile 组合扩展** - 可选包含文档、源码等附加内容,满足不同场景需求
- 📦 **精确 Classpath 管理** - 避免 MANIFEST.MF 长度限制
- ⚙️ **配置外部化** - 配置文件不打包进 JAR,支持动态修改
- 📝 **资源版本化管理** - Release 文档自动添加版本号
- 🌍 **跨平台支持** - Linux、Mac、Windows
## 🚀 快速开始
### 构建项目
```bash
# Thin 模式(默认)- 瘦身 JAR + 外部依赖
mvn clean verify
# Fat 模式 - 包含所有依赖的可执行 JAR
mvn clean verify -Pfat
```
构建完成后,分发包位于 `target/release/` 目录。
**详细部署指南请查看**: [Installation Guide](documents/Admin-Guide.md)
### 本地测试
构建完成后,您可以直接在 `target/release/` 目录测试应用,无需解压 ZIP:
```bash
# 进入 release 目录(或在 bin 目录下直接执行亦可)
cd target/release
# Linux/Mac(在release根目录或bin目录均可执行)
./bin/run.sh
# 或 cd bin && ./run.sh
# Windows(在release根目录或bin目录均可执行)
bin\run.cmd
# 或 cd bin && run.cmd
```
> **💡 提示**: 启动脚本会自动检测是否存在 `classpath.txt` 文件来判断运行模式:
> - 存在 `classpath.txt` → Thin模式(使用-cp参数)
> - 不存在 → Fat模式(使用-jar参数)
应用启动后,访问 http://localhost:8080 查看结果。
> **💡 提示**: 这种测试方式与生产环境完全一致,确保部署前验证通过。
## 🔧 Maven Profile 说明
本项目提供了多个 Maven Profile,可以组合使用以满足不同的构建需求。
### 核心 Profile
#### 1. `thin`(默认)- Thin 模式打包
**特点**:
- 生成瘦身 JAR(约 5KB),只包含应用代码
- 依赖库独立存放在 `lib/` 目录
- 生成 `classpath.txt` 精确管理依赖路径
- 适合微服务架构和频繁迭代的场景
**使用方式**:
```bash
# 默认激活,无需指定
mvn clean verify
# 显式指定
mvn clean verify -Pthin
```
**产物**:`my-demo-app-{version}-thin-dist.zip`
> **⚠️ 注意**: 默认情况下(不指定任何profile),只会激活 `thin` profile,不会包含文档和源码。
> 如需包含文档或源码,请显式指定对应的profile(见下方Profile组合示例)。
---
#### 2. `fat` - Fat 模式打包
**特点**:
- 生成包含所有依赖的可执行 JAR(约 20MB)
- 单个文件,部署简单
- 可直接使用 `java -jar` 运行
- 适合容器化部署和独立部署场景
**使用方式**:
```bash
mvn clean verify -Pfat
```
**产物**:`my-demo-app-{version}-fat-dist.zip`
> **⚠️ 注意**: Fat模式生成的JAR包含所有依赖(约20MB),而Thin模式的JAR仅包含应用代码(约5KB)。
>
> 如需包含文档或源码,请显式指定对应的profile(见下方Profile组合示例)。
---
### 可选 Profile(可与核心 Profile 组合使用)
#### 3. `include-documents` - 包含产品文档
**作用**:将以下产品文档复制到分发包中
- Release.md
- Admin-Guide.md
- Upgrade-Guide.md
- Full-Installation.md
- White-paper.md
- assets/ 目录(SQL脚本、配置附件等)
**使用方式**:
```bash
# Thin 模式 + 文档
mvn clean verify -Pthin,include-documents
# Fat 模式 + 文档
mvn clean verify -Pfat,include-documents
```
**特性**:
- ✅ 自动添加版本号到文档文件名(如 `Release-1.1.0.md`)
- ✅ 自动更新文档内部的交叉引用链接
- ✅ 版本文档和资源统一存储在 `documents/assets/{version}/` 目录
- ✅ 支持自定义文档的版本化管理(需要修改pom.xml)
**分发包结构**:
```
my-demo-app-{version}/
├── documents/
│ ├── Release-{version}.md
│ ├── Admin-Guide-{version}.md
│ ├── Upgrade-Guide-{version}.md
│ ├── Full-Installation-{version}.md
│ ├── White-paper-{version}.md
│ └── assets/ # 版本资源(含文档、SQL、附件)
│ └── {version}/
│ ├── *.md # 版本文档
│ ├── sql/ # 数据库脚本
│ └── attachments/ # 配置附件
└── ...
```
---
#### 4. `include-custom-source-code` - 包含完整源码
**作用**:将完整的源代码复制到分发包的 `source-code/` 目录
**使用方式**:
```bash
# Thin 模式 + 源码
mvn clean verify -Pthin,include-custom-source-code
# Fat 模式 + 文档 + 源码
mvn clean verify -Pfat,include-documents,include-custom-source-code
```
**包含内容**:
- ✅ Java 源代码(`src/main/java/`)
- ✅ 配置文件(`src/main/resources/`)
- ✅ 启动脚本(`src/main/scripts/`)
- ✅ Maven 配置(`pom.xml`)
- ✅ Assembly 描述符(`src/assembly/`)
- ✅ 产品文档(`documents/`,排除 assets)
- ✅ 项目说明(`README.md`)
**不包含的内容**:
- ❌ `documents/assets/` - 版本资源(在源码仓库中,但分发包中只包含当前版本)
- ❌ `target/` - 构建产物
**适用场景**:
- 开源项目发布
- 供客户学习研究
- 技术分享和演示
---
#### 5. `include-standard-source-code` - 生成标准源码包
**作用**:生成标准的 Maven 源码包(`-sources.jar`),用于仓库部署
**使用方式**:
```bash
mvn clean deploy -Pinclude-standard-source-code
```
**产物**:`my-demo-app-{version}-sources.jar`
**特点**:
- 符合 Maven 中央仓库规范
- IDE 可自动下载并关联源码
- 便于开发者阅读和学习
**注意**:此 Profile 通常与 `deploy` 阶段配合使用,而不是 `verify`。
---
### Profile 组合示例
#### 示例 1:生产环境部署(推荐)
```bash
# Thin 模式 + 文档
mvn clean verify -Pthin,include-documents
```
**适用场景**:生产环境部署,提供完整的文档支持
---
#### 示例 2:开源项目发布
```bash
# Thin 模式 + 文档 + 完整源码
mvn clean verify -Pthin,include-documents,include-custom-source-code
```
**适用场景**:GitHub 发布,提供完整的源代码和文档
---
#### 示例 3:Maven 仓库部署
```bash
# Fat 模式 + 标准源码包
mvn clean deploy -Pfat,include-standard-source-code
```
**适用场景**:部署到 Nexus/Artifactory,供其他项目依赖
---
#### 示例 4:最小化构建
```bash
# 仅 Thin 模式,无文档无源码
mvn clean verify
```
**适用场景**:CI/CD 流水线,快速构建和测试
---
### Profile 优先级和冲突
- **互斥 Profile**:`thin` 和 `fat` 不能同时使用(后指定的会覆盖先指定的)
- **可组合 Profile**:`include-documents`、`include-custom-source-code`、`include-standard-source-code` 可以与任意核心 Profile 组合
- **默认 Profile**:未指定时,默认使用 `thin` 模式
### 查看当前激活的 Profile
```bash
mvn help:active-profiles
```
输出示例:
```
The following profiles are active:
- thin (source: com.example:my-demo-app:1.1.0)
- include-documents (source: com.example:my-demo-app:1.1.0)
```
## 📂 项目结构
```
my-demo-app/
├── src/
│ ├── main/
│ │ ├── java/ # 应用代码
│ │ ├── resources/ # 配置文件(不打包进 JAR)
│ │ └── scripts/ # 启动脚本
│ └── assembly/ # 打包描述符
├── documents/ # 文档目录
│ ├── assets/ # 版本资源(文档、SQL、附件)
│ │ └── {version}/ # 版本号目录
│ │ ├── *.md # 版本文档
│ │ ├── sql/ # 数据库脚本
│ │ └── attachments/ # 配置附件
│ ├── Admin-Guide.md # 运维说明(源文件)
│ ├── Upgrade-Guide.md # 升级安装说明(源文件)
│ ├── Full-Installation.md # 安装说明(源文件)
│ ├── White-paper.md # 产品白皮书(源文件)
│ └── Release.md # 发布说明(源文件)
├── pom.xml # Maven 配置
└── README.md # 本文件
```
### 📁 documents/assets 目录规范
`documents/assets/` 目录用于存储版本相关的所有资源,包括版本文档、数据库脚本、配置模板等。
#### 目录结构
```
documents/assets/
├── {version}/ # 版本号目录(如 1.0.0, 1.1.0)
│ ├── Release-{version}.md # 版本文档
│ ├── White-paper-{version}.md
│ ├── Admin-Guide-{version}.md
│ ├── Upgrade-Guide-{version}.md
│ ├── Full-Installation-{version}.md
│ ├── README-{version}.md
│ ├── sql/ # 数据库脚本
│ │ ├── {version}-init.sql # 全量初始化脚本
│ │ ├── {version}-{14位时间戳}-{tag}.sql # 增量升级脚本
│ │ └── ... # 更多升级脚本
│ └── attachments/ # 该版本的配置文件、模板等附加资源
└── ... # 更多版本
```
#### 文件命名规范
**SQL 脚本**:
- `{version}-init.sql` - 全量初始化脚本(全新安装使用)
- `{version}-{14位时间戳}-{tag}.sql` - 增量升级脚本(从上一版本升级)
**附件目录**:
- `attachments` - 按版本组织的附件目录
- 每个版本只包含该版本**新增**的附件
#### 使用场景
**1. 全新安装**(参考 [Full Installation Guide](documents/Full-Installation.md))
```bash
# 执行全量初始化脚本
mysql -u root -p my_demo_app < documents/assets/{version}/sql/{version}-init.sql
```
**2. 版本升级**(参考 [Upgrade Guide](documents/Upgrade-Guide.md))
```bash
# 按时间戳顺序执行增量升级脚本
mysql -u root -p my_demo_app < documents/assets/{version}/sql/{version}-{14位时间戳}-{tag}.sql
```
**3. 配置附件**
```bash
# 复制当前版本的配置模板
cp documents/assets/{version}/attachments/custom-config.yml config/
```
#### 版本管理原则
- ✅ **累积性**:全量安装脚本包含所有历史版本的变更
- ✅ **增量性**:升级脚本只包含从上一版本到当前版本的变更
- ✅ **独立性**:每个版本的附件独立存放,便于追溯
- ✅ **自动化**:构建时自动合并生成全量脚本和带版本号的文档
#### 添加新版本资源
当发布新版本(如 v1.2.0)时:
1. **创建版本目录**:`documents/assets/1.2.0/`
2. **构建时自动生成版本文档** - Maven 会自动处理并保存到该目录
3. **创建全量脚本**:`documents/assets/1.2.0/sql/1.2.0-init.sql`
4. **创建升级脚本**:`documents/assets/1.2.0/sql/1.2.0-{14位时间戳}-{tag}.sql`
5. **添加新附件**:`documents/assets/1.2.0/attachments/`
6. **更新文档**:在 Full-Installation.md 和 Upgrade-Guide.md 中引用新资源
7. **构建验证**:运行 `mvn clean verify -Pinclude-documents` 检查资源是否正确打包
## 🛠️ 技术栈
- **Java**: 21
- **Spring Boot**: 3.5.13
- **Maven**: 3.6+
详细的技术栈和插件版本请查看 [Release Notes](documents/Release.md)。
## 📚 更多文档
- **[Release Notes](documents/Release.md)** - 版本发布说明和交付产物
- **[Installation Guide](documents/Admin-Guide.md)** - 部署指南、配置管理和运维手册
- **[Product White Paper](documents/White-paper.md)** - 产品白皮书和技术架构详解
## ❓ 常见问题
### 执行 `mvn deploy` 时会部署什么文件?
**部署的文件**:
- ✅ 主 JAR(`my-demo-app-{version}.jar`)
- ✅ ZIP 分发包(`my-demo-app-{version}-thin-dist.zip` 或 `fat-dist.zip`)
- ✅ 源码包(`my-demo-app-{version}-sources.jar`,需激活 `include-standard-source-code` profile)
- ✅ POM 文件(`my-demo-app-{version}.pom`)
**原因**:
- `maven-deploy-plugin` 使用默认配置,会部署所有构件(包括主 JAR 和附加构件)
- `maven-assembly-plugin` 配置了 `true`,将 ZIP 作为附加构件部署
- `maven-source-plugin` 在激活 `include-standard-source-code` profile 时生成并附加源码包
**设计理念**:
- 这是一个分发型项目,主要交付物是 ZIP 分发包
- 主 JAR 也会部署到仓库,供其他项目直接依赖(可选)
- ZIP 分发包适合最终用户下载和部署
- 源码包供 IDE 开发者参考和学习(可选)
> **💡 提示**: 如果不想部署任何文件(包括主 JAR 和 ZIP),可以在 pom.xml 中为 `maven-deploy-plugin` 添加 `true` 配置来完全跳过 deploy 阶段。
### 如何保证 target/release 目录下的文件与 ZIP 文件内的文件一致性?
**目标**:
- `target/release/` 目录下有构建产物(bin、config、documents、JAR等)
- ZIP 包中的内容应该与 `target/release/` **完全一致**
**设计原则**:
本项目采用了**“所见即所得”**的设计理念:
1. **target/release/** - Maven 构建的中间产物
- 用于本地测试和验证
- 所有插件(maven-resources-plugin、maven-dependency-plugin等)都将文件复制到此目录
- 用户可以直接在此目录运行应用,无需解压 ZIP
2. **ZIP 分发包** - 最终交付给用户的产物
- 由 maven-assembly-plugin 根据 `src/assembly/{profile}-dist.xml` 生成
- **直接打包整个 `target/release/` 目录**,不做额外过滤或转换
- 确保 ZIP 内容与本地测试环境完全一致
**如果发现`target/release/` 和 ZIP 内容不一致**,可能的原因:
- Assembly 配置中添加了额外的 `` 规则
- 构建过程中某些文件在 assembly 执行后被修改
- 手动修改了 `target/release/` 目录但未重新构建
**解决方案**:
```bash
# 清理并重新构建
mvn clean verify
# 验证一致性
# 1. 检查 target/release/ 目录内容
ls -R target/release/
# 2. 查看 ZIP 包内容
jar tf target/my-demo-app-{version}-{profile}-dist.zip
# 最后参考《如何增加或减少资源文件》进行处理
```
### 如何增加或减少资源文件?
如果您需要修改分发包中包含的资源文件(如添加新的配置文件、脚本或文档),需要同时修改以下两处配置:
#### 步骤 1: 修改 maven-resources-plugin 配置
在 `pom.xml` 的公共插件配置中,找到对应的 execution 并修改 `` 配置:
**示例:添加新的配置文件**
```xml
copy-config
process-resources
copy-resources
${project.build.directory}${release-basedir}/config
${project.basedir}/src/main/resources
application*.yml
application*.properties
custom-config.yml
```
**示例:添加新的启动脚本**
```xml
copy-scripts
process-resources
copy-resources
${project.build.directory}${release-basedir}/bin
${project.basedir}/src/main/scripts
*.sh
*.cmd
*.ps1
```
#### 步骤 2: 修改 assembly 描述符
在 `src/assembly/thin-dist.xml`(或 `fat-dist.xml`)中,确保新文件被包含在 ZIP 包中:
**示例:添加新的配置文件到 documents**
```xml
${project.basedir}/documents/Custom-Guide.md
/documents
Custom-Guide-${project.version}.md
```
**注意**:如果新文件需要版本化管理(如文档),还需要执行以下额外步骤:
**1. 在 `include-documents` profile 的 `maven-resources-plugin` 中排除该文件**
```xml
org.apache.maven.plugins
maven-resources-plugin
copy-documents
${project.basedir}/documents
Release.md
White-paper.md
Install.md
Custom-Guide.md
history/**
```
**2. 在 `maven-antrun-plugin` 中添加重命名和链接替换逻辑**
```xml
org.apache.maven.plugins
maven-antrun-plugin
rename-release-notes
process-resources
run
```
**3. 在 `backup-all-documents` execution 中添加备份逻辑**
```xml
backup-all-documents
initialize
run
```
#### 步骤 3: 重新构建
```bash
mvn clean verify
```
#### 验证
检查 `target/release/` 目录和生成的 ZIP 包,确认新文件已正确包含。
> **💡 提示**: 修改后建议运行 `mvn clean verify` 并检查 `target/release/` 目录,确保所有更改生效。
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 📄 许可证
MIT License