几天前我在 Maven 邮件列表上问了上述问题,得到了风滚草。幸运的是,我最终自己想通了。这里至少有一种明智的方法可以做到这一点:
在构建原型时,对您的 src/main/resources/archetype-resources/pom.xml 文件使用 Maven 过滤以替换当前项目版本。
这是如何完成的:
修改您的 archetype/pom.xml 文件以启用过滤 archetype-resources/pom.xml 文件而不是其他任何文件(因为您的原型文件自然会到处都有 ${variable}s 并且您不希望那些被替换为构建时,您希望在创建原型时替换它们)。
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>archetype-resources/pom.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>archetype-resources/pom.xml</exclude>
</excludes>
</resource>
</resources>
在过滤时启用转义字符,以便您可以转义原型 pom 中需要保持原样的所有变量,以便在原型生成时替换它们:
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<escapeString>\</escapeString>
</configuration>
</plugin>
</plugins>
</pluginManagement>
(请注意,上面显示的 <resources> 和 <pluginManagement> 元素应放在 POM 的 <build> 元素内。)
在您的原型 pom 中使用 ${project.version},您希望在其中插入原型项目的版本,并转义在原型生成时间之前应该保持未被替换的所有其他变量:
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>\${groupId}</groupId>
<artifactId>\${artifactId}</artifactId>
<version>\${version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>origin-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>