我有同样的问题,我正在
我的项目由多个子项目组成,例如:
myApp
|- myApp.war
|- myApp.ear
|- myApp.service
在根(myApp)pom.xml中,我有如下属性部分:
<environment>env1</environment>
也在 myapp 根目录中,我设置了
groupId
,如下所示,pom.xml 不会显示红色波浪下划线,所以这里一切都很好:
<groupId>com.example.projName-${env}</groupId> //this is fine
我可以对我的子项目工件 myApp.war、myApp.ear、myApp.service 做同样的事情,所以这里也很好。
但是,所有子组项目都必须引用父级项目,例如:
<parent>
<groupId>com.example.projName-${environment}</groupId> //get red squiggly underline
<artifactId>myApp</artifactId>
<version>1.0.0</version>
</parent>
修改 <parent>
元素中的
groupId会导致红色波浪下划线,当我将鼠标悬停在其上时,它会显示 父定义中的属性被禁止。
我这样修改groupId的原因是因为我希望将所有项目的模块推送到 Nexus 的公共位置,其名称由 projName-staging、projName-qa 等定义。
但是,我仍然可以通过
mvn clean install
构建我的应用程序并使用 mvn deploy
部署到 Nexus 快照。
但是尝试部署到 Nexus 版本在 mvn 版本上失败:准备阶段如下:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:3.0.1:prepare (default-cli) on project myApp: Can't release project due to non released dependencies :
[ERROR] com.example.myapp-${environment}:myapp:pom:1.0.1-SNAPSHOT
[ERROR] in project 'myapp-war' (com.example.myapp-env1:myapp-war:war:1.0.1-SNAPSHOT)
使用 Maven 配置文件进行特定于环境的构建。不要使用环境属性设置
groupId
,而是尝试使用配置文件进行特定于环境的配置。在根目录中定义配置文件pom.xml
,如下所示:
<profiles>
<profile>
<id>env1</id>
<properties>
<group.name.suffix>-env1</group.name.suffix>
</properties>
</profile>
<profile>
<id>qa</id>
<properties>
<group.name.suffix>-qa</group.name.suffix>
</properties>
</profile>
</profiles>
然后修改您的
groupId
以包含后缀:
<groupId>com.example.projName${group.name.suffix}</groupId>
您可以在特定环境的构建过程中使用
mvn clean install -Penv1
或 -Pqa
激活配置文件,从而允许每个部署拥有基于 groupId
后缀的唯一 Nexus 路径。
通过在
pom.xml
中为每个环境定义配置文件(例如 env1、qa),您可以动态设置 groupId
的后缀,确保您对 Nexus 的构建和部署可以引用正确的环境,而无需修改家长groupId
.