我正在创建一个Maven原型,它将生成一个项目框架,该项目框架将包含对原型所源自的项目的依赖。
例如,原始项目如下所示:
origin/archetype/... archetype for generating project
/core/... core services
/extra/... extra services 原型将生成一个带有POM的项目,该项目包含如下依赖关系:
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>origin-core</artifactId>
<version>SOMEVERSION</code>
</dependency>
</dependencies> 我希望SOMEVERSION是构建原型并将其安装到存储库中时原始项目的版本。
因此,如果原始项目的版本是1.0-SNAPSHOT,并且是mvn install版的,那么我希望原型生成对origin-core 1.0-SNAPSHOT的依赖。当原始项目发布并自动升级到1.0版时,我希望原型生成对origin-core 1.0的依赖。
基本上,我想在原型POM中使用${archetypeVersion}作为速度变量,但这似乎是不可能的。
有没有其他方法来完成我在这里尝试做的事情?
发布于 2011-08-29 02:42:32
几天前,我在Maven邮件列表上问了上面的问题,得到了答案。幸运的是,我最终自己找到了答案。至少有一种明智的方法可以做到这一点:
在构建原型时,在您的src/main/resources/archetype-resources/pom.xml文件上使用Maven来替换当前项目版本。
这是如何做到的:
修改您的archetype/pom.xml文件以启用对archetype-resources/pom.xml文件的过滤,而不是对任何其他文件(因为您的原型文件自然会到处都是${variable},并且您不希望在构建时替换它们,您希望在创建原型时替换它们)。
<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>发布于 2014-03-10 20:28:52
可接受答案的另一种解决方案是过滤archetype's descriptor/metadata文件中的默认属性
如下所示:
maven过滤只过滤这个文件:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>META-INF/maven/archetype-metadata.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>META-INF/maven/archetype-metadata.xml</exclude>
</excludes>
</resource>
</resources>原型元数据文件:
<archetype-descriptor ...>
<requiredProperties>
<requiredProperty key="projectVersion">
<defaultValue>${project.version}</defaultValue>
</requiredProperty>
</requiredProperties>
...
</archetype-descriptor>原型的POM将与之前类似,只是它将使用projectVersion required属性值作为项目版本:
<?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>${projectVersion}</version>
</dependency>
</dependencies>
</project>这种方法的优点是,它避免了必须转义原型的POM中的所有属性值以及随之而来的资源插件配置。就我个人而言,我发现所有这些都很难看,很容易出错。
这确实意味着用户在生成原型时需要确认或更改项目版本。根据场景的不同,我猜这可能被认为是一件好事,也可能是件坏事。
发布于 2014-06-19 07:08:16
我尝试了一些相当愚蠢的东西,它似乎起作用了。我在META-INF/maven/archetype-metadata.xml文件中添加了以下内容:
<requiredProperties>
<requiredProperty key="archetypeVersion"> </requiredProperty>
</requiredProperties>你可能认为它会在默认情况下知道它,但它不是,所以这似乎提醒它使用它。也许是由于maven中的一个bug。
https://stackoverflow.com/questions/7223031
复制相似问题