必须将pom.xml中packaging设为war,再通过maven-war-plugin的finalname配置自定义war文件名,如<finalname>myapp-staging</finalname>,或结合profile动态生成环境化名称。

你需要让Maven打包出来的WAR文件名不是默认的artifactId-version.war,而是符合部署规范或环境标识的名称,比如myapp-prod.war或backend-api.war——这必须在pom.xml中精确配置maven-war-plugin,否则打包仍会沿用默认命名规则,导致CI/CD流程中脚本匹配失败或人工部署时反复重命名。
确认项目已声明为WAR类型
打开pom.xml,检查<packaging></packaging>标签是否明确设置为war:
→ 在<project></project>根节点内,必须存在且仅存在一行:<packaging>war</packaging>
→ 若缺失、拼写错误(如War、WAR)或被注释掉,Maven将回退为jar打包,maven-war-plugin根本不会生效。【这是所有后续配置的前提,跳过会导致整个自定义名称失效】
直接指定finalName(最常用方法)
在pom.xml的<build>→<plugins></plugins></build>区块中添加或修改maven-war-plugin配置:
方法一:硬编码固定名称
→ 在<plugin></plugin>的<configuration></configuration>内加入:<finalname>myapp-staging</finalname>
→ 打包后生成target/myapp-staging.war,不带版本号,简洁可控。
方法二:引用Maven属性动态生成
→ 使用${project.artifactId}或${project.version}组合:<finalname>${project.artifactId}-release-${project.version}</finalname>
→ 生成如myapp-release-1.2.0.war,保留版本信息便于追溯;但注意finalName本身不支持profile变量,若需环境区分,得配合其他方式。
通过warName参数覆盖(兼容旧版写法)
某些老版本插件(如2.x系列)可能忽略finalName,此时可显式使用warName:
第一步:确保插件版本≥2.4
→ 在<plugin></plugin>中声明<version>2.4</version>或更高(推荐3.3.2)
第二步:在<configuration></configuration>中添加:<warname>${project.artifactId}-uat</warname>
→ 此参数优先级高于finalName,但仅在maven-war-plugin中有效,finalName是Maven构建生命周期全局参数,更通用。
第三步:验证target目录输出
→ 执行mvn clean package后,检查target/下是否生成预期名称的WAR文件;若仍为artifactId-version.war,说明插件未加载或<packaging>war</packaging>缺失。
结合Profile实现多环境命名
当测试、预发、生产环境需要不同WAR名时,不能只靠finalName硬编码——它不随profile切换而变化。
方法一:用属性占位符+激活profile
→ 在<profiles></profiles>中定义:<profile><id>prod</id><properties><war.name>myapp-prod</war.name></properties></profile>
→ 在<plugin></plugin>的<configuration></configuration>中写:<finalname>${war.name}</finalname>
→ 激活命令:mvn clean package -Pprod
方法二:避免属性未定义报错
→ 在<properties></properties>顶层声明默认值:<war.name>myapp-dev</war.name>
→ 这样即使未激活任何profile,也能生成myapp-dev.war,防止构建中断。











