Maven:根据个人资料选择父项目

时间:2011-06-28 13:14:15

标签: maven pom.xml profiles

我有一个maven项目 - 它是jenkins的插件。它的父母应该是:

<parent>
  <groupId>org.jenkins-ci.plugins</groupId>
  <artifactId>plugin</artifactId>
  <version>1.414</version>
</parent>

但与此同时,这个插件也可以用于hudson,而无需更改任何代码行。但它的父项目应该是:

<parent>
  <groupId>org.jvnet.hudson.plugins</groupId>
  <artifactId>hudson-plugin-parent</artifactId>
  <version>2.0.1</version>
</parent>

我可以为此指定2个不同的配置文件,并使用它们为jenkins或hudson构建插件吗?所以我称之为:

mvn package -P jenkins

mvn package -P hudson

我尝试在配置文件中指定属性,但这些属性不会被<parent>标记内的值替换。那么有没有其他可能为两者构建插件,但尽可能使用公共代码和文件?

已添加:所以,如果我不能这样做,那我该怎么办?如何重构?新结构应该是什么?

6 个答案:

答案 0 :(得分:2)

如前所述,这是不可能的。 此外,无法为父版本设置属性,因为插值会比处理配置文件早得多。

我建议您按如下方式创建一个masterbuild项目:

master
|-plugin-jenkins
|-plugin-hudson
|-plugin-assembly

主人应该像往常一样建立所有三个人。但是,在程序集中,您可以将两个插件中的每个插件作为依赖项添加到单独的配置文件中。并且...这些插件中的每一个都可以拥有您喜欢的父级。

这显然有点偏离Maven惯例,但我相信它是解决您问题的方法。

答案 1 :(得分:1)

这是不可能的,因为标签“parent”在pom的profiles section中不可用。

答案 2 :(得分:0)

不,你不能那样做。你必须以某种方式重构以避免必要性。

答案 3 :(得分:0)

如上所述,已经不可能了。我建议为jenkins插件和hudson插件制作单独的项目。我认为,在不远的将来,不会再起作用,因为Hudons和Jenkins会分歧。

答案 4 :(得分:0)

目前我们决定坚持使用1个存储库和2个单独的pom.xml文件,提供pom.xml用于构建项目的maven密钥。

mvn package -f pom-jenkins.xml
mvn package -f pom-hudson.xml

答案 5 :(得分:0)

通常,您应该能够通过Java系统属性或环境变量设置父组POM的{group,artifact} Id和版本,但似乎Maven中有一个Bug,只能在4中修复。 X: https://issues.apache.org/jira/browse/MNG-624

另一种解决方案是将父POM的包含委托给您在relativePath元素中引用的父POM,并更改目标的内容,例如:通过符号链接或cp命令。

所以在主POM中你会写:

<parent>
    <groupId>org.mycompany.project</groupId>
    <artifactId>foo-artifact</artifactId>
    <version>1.0.0</version>
    <relativePath>./my-parent.pom</relativePath>
</parent>

在my-parent-jenkins中你只需要:

<groupId>org.mycompany.project</groupId>
<artifactId>foo-artifact</artifactId>
<version>1.0.0</version>

<parent>
    <groupId>org.jenkins-ci.plugins</groupId>
    <artifactId>plugin</artifactId>
    <version>1.414</version>
</parent>

与你放在my-parent-hudson.pom中的hudson块相同的项目信息。

不,你可以使用

ln -s my-parent-jenkins.pom my-parent.pom

ln -s my-parent-hudson.pom  my-parent.pom

包含相应的父POM,而无需为项目维护两个不同的主POM文件。

如果在relativePath中引用的地方不存在POM,Maven将在远程存储库[1]中查找POM,这也是在本地覆盖父POM的简单方法。

[1] http://maven.apache.org/components/ref/3.3.9/maven-model/maven.html#class_parent