2011-08-28 75 views
17

我创建了一个Maven原型,它生成一个项目框架, 将包含对原型 来源项目的依赖关系。如何在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版的快照和为mvn install版,那么我想原型生成上 origin-core 1.0-SNAPSHOT的依赖。当原始项目被释放,并且自动碰撞到版本1.0时,我希望原型生成依赖项 origin-core 1.0

基本上我想用${archetypeVersion}作为原型 POM中的Velocity变量,但这似乎不可能。

是否有任何其他方式来完成我在这里要做的事情?

回答

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>元素中。)

使用${project.version}在你的原型POM,在那里你要插入你的原型项目的版本,和逃避所有其他变量应保持取代的,直到原型生成时间:

<?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> 
+0

正是我所需要的。非常感谢。 –

+0

工程就像一个魅力!谢谢。 – Malvin

+0

这是如此甜蜜,优秀的职位。 – ocarlsen

12

替代解决了接受的答案是在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中的所有属性值以及随之而来的资源插件配置。就我个人而言,我发现所有这些都很丑陋,容易出错。

这意味着在生成原型时要求用户确认或更改项目版本。根据情况,我想这可能被认为是好事或坏事。

+0

这个解决方案肯定比接受的更好。非常感谢你。它节省了我大量的时间 –

-1

我尝试了一些相当愚蠢的东西,它似乎已经奏效。我增加了以下我的META-INF /行家/原型-metadata.xml文件:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

你可能会认为它会知道它在默认情况下,但它并没有因此这似乎在提醒它使用它。也许这是由于maven中的一个错误。

+0

如果您使用交互模式并且您必须过滤原型测试资源,则这不起作用。或者,您可以依靠@PhilMander答案来完成这项工作。 – LoganMzz