refactor: 优化打包结构,主JAR放入lib目录并带版本号

- pom.xml: 移除finalName配置,JAR保留版本号
- assembly.xml: 主JAR放入lib目录(useProjectArtifact=true)
- start.sh: 简化启动逻辑
  - ClassPath统一为 lib/*
  - 无需单独匹配主JAR文件名
  - 只需配置MAIN_CLASS即可启动

优势:
- 主JAR带版本号便于版本识别和升级
- 所有JAR统一放lib目录,结构清晰
- 启动脚本更简洁,无需APP_NAME匹配JAR
This commit is contained in:
zhangjf 2026-02-22 20:30:28 +08:00
parent a4aa4b4156
commit 2184dce6a8
3 changed files with 13 additions and 44 deletions

View File

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

View File

@ -105,8 +105,6 @@
<!-- 公共构建配置 - 所有服务模块继承 --> <!-- 公共构建配置 - 所有服务模块继承 -->
<build> <build>
<!-- 输出文件名不带版本号 -->
<finalName>${project.artifactId}</finalName>
<plugins> <plugins>
<!-- Maven JAR Plugin - 打包普通JAR排除资源文件 --> <!-- Maven JAR Plugin - 打包普通JAR排除资源文件 -->
<plugin> <plugin>

View File

@ -36,36 +36,24 @@ if [[ -z "${INSTANCE_NAME}" ]] || [[ "${INSTANCE_NAME}" == '\${APP_NAME}' ]]; th
fi fi
TENANT_ID=${TENANT_ID:-""} TENANT_ID=${TENANT_ID:-""}
# 4. 主JAR文件路径 # 4. 主类从service.properties读取必须配置
JAR_FILE="${APP_HOME}/${APP_NAME}.jar"
if [ ! -f "$JAR_FILE" ]; then
echo "Error: No JAR file found: ${JAR_FILE}"
exit 1
fi
# 5. 主类从service.properties读取或使用默认值
MAIN_CLASS=${MAIN_CLASS:-""} MAIN_CLASS=${MAIN_CLASS:-""}
if [ -z "$MAIN_CLASS" ]; then if [ -z "$MAIN_CLASS" ]; then
echo "Error: MAIN_CLASS not configured in service.properties" echo "Error: MAIN_CLASS not configured in service.properties"
exit 1 exit 1
fi fi
# 6. 构建ClassPathlib目录所有jar + 主jar # 5. ClassPathlib目录所有jar包括主JAR和依赖
# 检查lib目录是否存在 if [ ! -d "${APP_HOME}/lib" ]; then
if [ -d "${APP_HOME}/lib" ]; then echo "Error: lib directory not found: ${APP_HOME}/lib"
# 构建classpath: lib/* + 主JAR exit 1
CLASSPATH="${APP_HOME}/lib/*:${JAR_FILE}"
LAUNCH_MODE="classpath"
else
# fallback: fat jar模式向后兼容
CLASSPATH="${JAR_FILE}"
LAUNCH_MODE="fatjar"
fi fi
CLASSPATH="${APP_HOME}/lib/*"
# 7. 日志目录使用INSTANCE_NAME区分不同实例 # 6. 日志目录使用INSTANCE_NAME区分不同实例
LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}" LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}"
# 8. PID文件路径 # 7. PID文件路径
PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid" PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid"
# JVM参数可通过环境变量覆盖 # JVM参数可通过环境变量覆盖
@ -104,23 +92,16 @@ echo "Starting ${INSTANCE_NAME}..."
echo " APP_NAME: ${APP_NAME}" echo " APP_NAME: ${APP_NAME}"
echo " INSTANCE_NAME: ${INSTANCE_NAME}" echo " INSTANCE_NAME: ${INSTANCE_NAME}"
echo " APP_HOME: ${APP_HOME}" echo " APP_HOME: ${APP_HOME}"
echo " JAR_FILE: ${JAR_FILE}"
echo " MAIN_CLASS: ${MAIN_CLASS}" echo " MAIN_CLASS: ${MAIN_CLASS}"
echo " LAUNCH_MODE: ${LAUNCH_MODE}" echo " CLASSPATH: ${CLASSPATH}"
echo " LOG_HOME: ${LOG_HOME}" echo " LOG_HOME: ${LOG_HOME}"
echo " JAVA_OPTS: ${JAVA_OPTS}" echo " JAVA_OPTS: ${JAVA_OPTS}"
if [ -n "${TENANT_ID}" ]; then if [ -n "${TENANT_ID}" ]; then
echo " TENANT_ID: ${TENANT_ID}" echo " TENANT_ID: ${TENANT_ID}"
fi fi
# 根据启动模式选择启动方式 # 启动命令java -cp lib/* MainClass
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 & 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 # 保存PID
echo $! > $PID_FILE echo $! > $PID_FILE