feat: 优化打包方式为普通JAR+依赖分离

- pom.xml:
  - 添加finalName配置去除版本号
  - maven-jar-plugin排除资源文件
  - 禁用spring-boot-maven-plugin repackage
  - 各服务移除冗余的plugin配置

- assembly.xml:
  - 主JAR放根目录(仅服务代码)
  - lib目录放依赖JAR

- start.sh:
  - 支持java -cp classpath模式启动
  - 从service.properties读取MAIN_CLASS
  - 向后兼容fat jar模式

- service.properties:
  - 所有服务添加MAIN_CLASS配置

优势:
- 主JAR从131MB缩小到103KB
- 多服务部署可共享lib目录
- 资源文件外置便于修改
This commit is contained in:
zhangjf 2026-02-22 20:22:27 +08:00
parent b8044c3769
commit a4aa4b4156
21 changed files with 119 additions and 91 deletions

View File

@ -48,7 +48,7 @@
</fileSet>
</fileSets>
<!-- 主JAR文件放到根目录Spring Boot fat jar已包含所有依赖) -->
<!-- 主JAR文件放到根目录只包含服务代码,不包含资源和依赖) -->
<files>
<file>
<source>${project.build.directory}/${project.artifactId}.jar</source>
@ -57,4 +57,14 @@
<fileMode>0644</fileMode>
</file>
</files>
<!-- lib目录 - 所有依赖JAR不包含项目自身 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<scope>runtime</scope>
<fileMode>0644</fileMode>
</dependencySet>
</dependencySets>
</assembly>

View File

@ -70,13 +70,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-cust
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.cust.CustApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -62,13 +62,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-exp
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.exp.ExpApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -68,13 +68,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-file
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.file.FileApplication
# 实例名称留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -73,13 +73,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-gateway
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.gateway.GatewayApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -62,13 +62,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-proj
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.proj.ProjApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -62,13 +62,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-receipt
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.receipt.ReceiptApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -67,13 +67,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-report
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.report.ReportApplication
# 实例名称留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -62,13 +62,6 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称
APP_NAME=fund-req
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.req.ReqApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
INSTANCE_NAME=

View File

@ -109,15 +109,6 @@
<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<!-- Maven Assembly Plugin - 打包为tar.gz -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -6,6 +6,9 @@
# 服务名称对应JAR文件名用于Nacos服务注册
APP_NAME=fund-sys
# 主类(启动入口)
MAIN_CLASS=com.fundplatform.sys.SysApplication
# 实例名称多租户场景使用留空则默认等于APP_NAME
# 多租户示例fund-sys-shared, fund-sys-vip001
INSTANCE_NAME=

40
pom.xml
View File

@ -103,4 +103,44 @@
</pluginRepository>
</pluginRepositories>
<!-- 公共构建配置 - 所有服务模块继承 -->
<build>
<!-- 输出文件名不带版本号 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Maven JAR Plugin - 打包普通JAR排除资源文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
<!-- 排除资源文件资源文件通过assembly打包到conf目录 -->
<excludes>
<exclude>**/*.yml</exclude>
<exclude>**/*.yaml</exclude>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
<exclude>**/*.json</exclude>
</excludes>
</configuration>
</plugin>
<!-- Spring Boot Maven Plugin - 禁用repackage生成普通JAR -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
<!-- 禁用repackage不生成fat jar -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -36,29 +36,36 @@ if [[ -z "${INSTANCE_NAME}" ]] || [[ "${INSTANCE_NAME}" == '\${APP_NAME}' ]]; th
fi
TENANT_ID=${TENANT_ID:-""}
# 4. JAR文件路径优先查找根目录的主JAR再查找lib目录
# Spring Boot fat jar已包含所有依赖主JAR在根目录
# 4. 主JAR文件路径
JAR_FILE="${APP_HOME}/${APP_NAME}.jar"
if [ ! -f "$JAR_FILE" ]; then
# fallback: 查找lib目录兼容旧版打包结构
JAR_FILE=$(ls ${APP_HOME}/lib/${APP_NAME}*.jar 2>/dev/null | head -1)
fi
if [ ! -f "$JAR_FILE" ]; then
# 最后尝试: lib目录任意jar向后兼容
JAR_FILE=$(ls ${APP_HOME}/lib/*.jar 2>/dev/null | head -1)
fi
if [ -z "$JAR_FILE" ] || [ ! -f "$JAR_FILE" ]; then
echo "Error: No JAR file found for ${APP_NAME}"
echo " Searched: ${APP_HOME}/${APP_NAME}.jar"
echo " Searched: ${APP_HOME}/lib/${APP_NAME}*.jar"
echo " Searched: ${APP_HOME}/lib/*.jar"
echo "Error: No JAR file found: ${JAR_FILE}"
exit 1
fi
# 5. 日志目录使用INSTANCE_NAME区分不同实例
# 5. 主类从service.properties读取或使用默认值
MAIN_CLASS=${MAIN_CLASS:-""}
if [ -z "$MAIN_CLASS" ]; then
echo "Error: MAIN_CLASS not configured in service.properties"
exit 1
fi
# 6. 构建ClassPathlib目录所有jar + 主jar
# 检查lib目录是否存在
if [ -d "${APP_HOME}/lib" ]; then
# 构建classpath: lib/* + 主JAR
CLASSPATH="${APP_HOME}/lib/*:${JAR_FILE}"
LAUNCH_MODE="classpath"
else
# fallback: fat jar模式向后兼容
CLASSPATH="${JAR_FILE}"
LAUNCH_MODE="fatjar"
fi
# 7. 日志目录使用INSTANCE_NAME区分不同实例
LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}"
# 6. PID文件路径
# 8. PID文件路径
PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid"
# JVM参数可通过环境变量覆盖
@ -98,13 +105,22 @@ echo " APP_NAME: ${APP_NAME}"
echo " INSTANCE_NAME: ${INSTANCE_NAME}"
echo " APP_HOME: ${APP_HOME}"
echo " JAR_FILE: ${JAR_FILE}"
echo " MAIN_CLASS: ${MAIN_CLASS}"
echo " LAUNCH_MODE: ${LAUNCH_MODE}"
echo " LOG_HOME: ${LOG_HOME}"
echo " JAVA_OPTS: ${JAVA_OPTS}"
if [ -n "${TENANT_ID}" ]; then
echo " TENANT_ID: ${TENANT_ID}"
fi
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 &
# 根据启动模式选择启动方式
if [ "$LAUNCH_MODE" == "classpath" ]; then
# ClassPath模式java -cp lib/*:app.jar MainClass
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -cp "$CLASSPATH" $MAIN_CLASS $CONFIG_OPTS > /dev/null 2>&1 &
else
# FatJar模式java -jar app.jar向后兼容
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 &
fi
# 保存PID
echo $! > $PID_FILE