最常用、最可靠的方式是用test -f检查target/目录下的jar或war文件是否存在;maven默认将产物生成在target/${artifactid}-${version}.jar或.war,若配置了则以该值命名,路径固定、可预测。

直接用 test -f 检查 target 目录下的 jar 或 war 文件是否存在,是最常用、最可靠的方式。Maven 默认把打包产物放在项目根目录的 target/ 子目录里,文件名通常由 pom.xml 中的 artifactId 和 version 决定,比如 myapp-1.0.0.jar。
确认产物路径和文件名
先明确你要检查的具体文件:
- 普通 Java 项目打 jar 包:默认是
target/${artifactId}-${version}.jar - Spring Boot 项目(使用
spring-boot-maven-plugin):通常是target/${artifactId}-${version}.jar,但可执行 jar 名可能带-exec后缀或由<finalname></finalname>指定 - Web 项目打 war 包:默认是
target/${artifactId}-${version}.war - 如果
pom.xml里配置了<finalname>myapp</finalname>,那产物就是target/myapp.jar或target/myapp.war
Shell 中常用判断写法
在脚本或命令行中,可以这样写:
- 检查标准 jar 是否存在:
if test -f "target/myapp-1.0.0.jar"; then echo "打包成功"; else echo "打包失败或未生成"; fi - 更健壮的写法(兼容不同版本号):
if ls target/myapp-*.jar 1>/dev/null 2>&1; then echo "至少一个 jar 存在"; else echo "没找到匹配的 jar"; fi - 结合 Maven 打包命令一起用:
mvn clean package && test -f "target/myapp-*.jar" && echo "构建并验证通过"
注意跳过测试时产物仍会生成
mvn clean package -Dmaven.test.skip=true 或 -DskipTests 不影响 jar/war 的生成,只跳过测试阶段。只要 package 阶段成功执行,产物就该出现在 target/ 下。如果产物缺失,说明打包过程本身中断(如编译失败、插件配置错误),不是跳过测试导致的。
排除常见干扰项
别误判这些情况:
-
target/classes/里有 class 文件 ≠ 打包完成——这只是编译输出,不是最终产物 -
target/maven-status/或target/generated-sources/存在,不代表 jar 已生成 - 用
mvn install会把 jar 安装到本地仓库(~/.m2/repository/),但target/下的产物仍需单独检查 - 多模块项目要进对应子模块目录下检查,不是在父项目根目录找











