问题一:JAR包缺少主清单属性
问题描述
在使用 java -jar
命令启动Spring Boot项目时,遇到以下错误:
demo-service.jar中没有主清单属性
问题原因
- pom.xml 中 spring-boot-maven-plugin 配置不正确
- 打包时跳过了主清单文件的生成
- 主类(Main Class)配置缺失或错误
解决方案
- 检查并修正 pom.xml 配置
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><!-- 指定主类 --><mainClass>com.example.demo.DemoApplication</mainClass><!-- 删除 skip 配置,或设置为 false --><!-- <skip>true</skip> --></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
- 验证主类是否存在
- 确保主类路径正确
- 检查主类是否包含 main 方法
- 确保包名与配置一致
- 重新打包
# 清理之前的构建
mvn clean# 打包(跳过测试)
mvn package -DskipTests
- 验证JAR包
# 查看 MANIFEST.MF 内容
jar tvf target/demo-service.jar | grep MANIFEST
# 或
unzip -p target/demo-service.jar META-INF/MANIFEST.MF
问题二:JAR包名称不正确
问题描述
打包后的 JAR 文件名称与预期不符,导致部署脚本无法正确找到和执行 JAR 文件。
问题原因
- pom.xml 中的 artifactId 与期望的文件名不一致
- 未指定最终的打包名称
解决方案
- 设置固定的最终名称
<build><!-- 直接指定最终文件名 --><finalName>demo-service</finalName><plugins><!-- ... 其他插件配置 ... --></plugins>
</build>
- 使用项目属性动态设置
<properties><final.name>demo-service</final.name>
</properties><build><finalName>${final.name}</finalName>
</build>
- 验证打包结果
# 检查生成的文件
ls -l target/demo-service.jar
最佳实践
1. 项目配置检查清单
- pom.xml 中包含 spring-boot-maven-plugin
- 正确配置了主类路径
- 移除了 skip 配置或设置为 false
- 指定了正确的打包文件名
- 所有必要的依赖都已声明
2. 打包流程
# 1. 清理旧的构建文件
mvn clean# 2. 编译和打包
mvn package -DskipTests# 3. 验证生成的文件
ls -l target/*.jar# 4. 检查 MANIFEST.MF
jar tvf target/demo-service.jar | grep MANIFEST# 5. 测试运行
java -jar target/demo-service.jar --spring.profiles.active=prod
3. 部署步骤
# 1. 创建部署目录
mkdir -p /opt/demo-service# 2. 复制文件
cp target/demo-service.jar /opt/demo-service/
cp service.sh /opt/demo-service/# 3. 设置权限
chmod +x /opt/demo-service/service.sh# 4. 启动服务
cd /opt/demo-service
./service.sh start# 5. 检查状态
./service.sh status
4. 常用调试命令
# 查看 JAR 包内容
jar tvf demo-service.jar# 查看日志
tail -f app.log# 检查进程
ps -ef | grep demo-service# 检查端口
netstat -nltp | grep 8080
注意事项
-
打包相关
- 确保使用正确版本的 JDK
- 注意 spring-boot-maven-plugin 的版本与 Spring Boot 版本匹配
- 打包时建议先执行 clean 清理旧文件
-
部署相关
- 确保目标服务器有足够的磁盘空间
- 检查 JVM 参数配置是否合适
- 注意文件权限设置
-
运行相关
- 使用正确的 Spring profiles
- 确保配置文件中的端口未被占用
- 设置适当的日志级别便于排查问题
这个教程涵盖了 Spring Boot 项目打包部署中最常见的两个问题及其解决方案,希望能帮助大家更好地处理类似问题。如果遇到其他问题,也可以参考这个思路进行排查和解决。