当前情况:
父POM文件中有一个distributionManagement部分,其中定义了两个仓库(releases和snapshots);请参见下面的内容:
父POM文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<buildVersion>0.7</buildVersion>
</properties>
<groupId>x.y.z</groupId>
<artifactId>abc</artifactId>
<version>${buildVersion}</version>
<packaging>pom</packaging>
<modules>
<module>moduleA</module>
<module>moduleB</module>
<module>moduleC</module>
</modules>
<dependencies>
</dependencies>
<distributionManagement>
<repository>
<id>releases</id>
<url>http://xyz/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://xyz/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<profiles>
<profile>
<id>snapshots-enabled</id>
<properties>
<repositoryUrl>http://xyz/nexus/content/repositories/snapshots/</repositoryUrl>
<repositoryId>snapshots</repositoryId>
</properties>
</profile>
<profile>
<id>release-enabled</id>
<properties>
<repositoryUrl>http://xyz/nexus/content/repositories/releases/</repositoryUrl>
<repositoryId>releases</repositoryId>
</properties>
</profile>
</profiles>
</project>
基于在同一pom文件中指定的“版本”,Maven会自动识别是否在Nexus的发布版或快照版存储库中部署构件。(我认为这是通过检查版本号是否有“-SNAPSHOT”后缀来完成的。)
存在一个子模块,其中定义了一些deploy-file目标,请参见下文: 子模块:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>x.y.z</groupId>
<artifactId>abc</artifactId>
<version>${buildVersion}</version>
</parent>
<groupId>${parent.groupId}</groupId>
<artifactId>childArtifactId</artifactId>
<version>${parent.version}</version>
<packaging>war</packaging>
<name>MyChildProject</name>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<executions>
<execution>
<id>deploy-TA</id>
<configuration>
<groupId>${project.groupId}</groupId>
<artifactId>TA</artifactId>
<version>${project.version}</version>
<url>http://xyz/nexus/content/repositories/releases/</url>
<repositoryId>releases</repositoryId>
<file>${basedir}/target/TA.war</file>
</configuration>
<phase>deploy</phase>
<goals>
<goal>deploy-file</goal>
</goals>
</execution>
<execution>
<id>deploy-OA</id>
<configuration>
<groupId>${project.groupId}</groupId>
<artifactId>OA</artifactId>
<version>${project.version}</version>
<url>http://xyz/nexus/content/repositories/releases/</url>
<repositoryId>releases</repositoryId>
<file>${basedir}/target/OA.war</file>
</configuration>
<phase>deploy</phase>
<goals>
<goal>deploy-file</goal>
</goals>
</execution>
<execution>
<id>deploy-CSA</id>
<configuration>
<groupId>${project.groupId}</groupId>
<artifactId>CSA</artifactId>
<version>${project.version}</version>
<url>http://xyz/nexus/content/repositories/releases/</url>
<repositoryId>releases</repositoryId>
<file>${basedir}/target/CSA.war</file>
</configuration>
<phase>deploy</phase>
<goals>
<goal>deploy-file</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
问题:
如上所示,我在子POM中必须为每个配置标签显式指定url和repositoryId标签。如果没有这些标签,将会抛出错误并且deploy-file目标会失败。
现在,我不想在子POM中硬编码它们的值。相反,我希望根据条件从父POM继承这些值:如果父POM使用发布存储库,则子POM也应该使用相同的存储库。如果父POM使用快照存储库,则子POM也应该使用相同的存储库。(再次注意,父POM中没有指定使用相应存储库的条件,而是由maven自动完成,如上所述)
那么,如何基于父/子POM中的某些条件评估,在子POM中进行有条件的值填充?
我尝试过的方法:
我在父POM中添加了以下配置段:
<profiles>
<profile>
<id>snapshots-enabled</id>
<properties>
<repositoryUrl>http://xyz/nexus/content/repositories/snapshots/</repositoryUrl>
<repositoryId>snapshots</repositoryId>
</properties>
</profile>
<profile>
<id>release-enabled</id>
<properties>
<repositoryUrl>http://xyz/nexus/content/repositories/releases/</repositoryUrl>
<repositoryId>releases</repositoryId>
</properties>
</profile>
</profiles>
如上所示,有两个配置文件,它们各自具有相同的属性但值不同。然而,我无法在父POM或子POM中使用它们的ID来填充上述属性。例如,在父POM中使用${repositoryUrl} 或在子POM中使用${parent.repositoryUrl}都不起作用。IntelliJ会立即以红色显示。尽管如此,如果我仍然尝试使用“mvn deploy -P release-enabled”命令,则部署仍将失败,因为Maven无法动态替换上述属性的值。(我没有在配置文件中添加activation部分是因为我需要通过TeamCity构建整个项目,后者将没有环境变量。因此,我只能通过命令行传递应该使用哪个配置文件的信息。)
是否有任何关于如何在父/子POM中动态填充值的建议?是否可能进行if-else类似的表达式评估,可能基于执行“mvn deploy”命令时可以传递的一些参数?