我正在创建一个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
。
基本上我想在原型中使用${archetypeVersion}
作为Velocity变量
POM,但这似乎不可能。
有没有其他方法可以完成我在这里尝试做的事情?
答案 0 :(得分:36)
我几天前在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>
答案 1 :(得分:13)
接受答案的另一种解决方案是过滤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
必需的属性值作为项目版本:
<?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中的所有属性值以及随之而来的资源插件配置。就个人而言,我发现所有这些都非常丑陋且容易出错。
这确实意味着在生成原型时要求用户确认或更改项目版本。根据情景,我想这可能被视为好事或坏事。
答案 2 :(得分:-1)
我尝试了一些相当愚蠢的东西,似乎有效。我将以下内容添加到我的META-INF / maven / archetype-metadata.xml文件中:
<requiredProperties>
<requiredProperty key="archetypeVersion"> </requiredProperty>
</requiredProperties>
你会认为默认情况下会知道它,但事实并非如此,这似乎提醒它使用它。也许这是由于maven中的一个错误。