2011-06-28 36 views
3

我有一个maven项目 - 它是jenkins的插件。它的父母应该是:Maven:根据配置文件选择父项目

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

但同时这个插件也可以用于哈德森,而不会改变任何代码行。但对于它的父项目应该是:

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

我可以指定2个不同的配置文件为,并使用它们来构建插件相应詹金斯或哈德森?所以,我呼吁类似的东西:

mvn package -P jenkins 

mvn package -P hudson 

我试图在配置文件中指定的属性,但这些不是由<parent>标签内的值替换。那么是否还有其他可能性为两者构建插件,但是尽可能使用通用代码和文件?

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

回答

0

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

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

不,你不能那样做。你将不得不重构以避免必要性。

0

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

2

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

我会建议你创建一个masterbuild项目如下:

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

主应该建立三个如常。但是,在汇编中,您可以将两个插件中的每一个作为依赖关系添加到单独的配置文件中。而且......这些插件中的每一个都可以有你喜欢的父母。

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

+0

谢谢,我会试试看。但是这样我必须得到我的代码的两个副本:在plugin-jenkins和plugin-hudson中。它能以某种方式做到这一点,我建立基于詹金斯代码哈德森或反之亦然? –

+0

那么,我真的会建议你有两个单独的项目来包装这个(至少)。正如Karl-Heinz在下面指出的那样,Hudson和Jenkins已经分道扬it,很可能现在(仍然)工作的东西在不久的将来将无法工作。 您可以将大部分代码保留在核心模块中,然后在包装模块(取决于核心)中使用Hudson或Jenkins特定的东西。 沿着这些线应该解决你的问题。 – carlspring

0

在一般情况下,你应该能够设置{组,神器}通过Java系统属性或环境变量父POM的标识和版本,但它似乎有在Maven的一个错误,这将只固定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> 

在我的父母 - 詹金斯你只想把:

<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中。

不,你既可以使用

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

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

包括各自的父POM,而不需要维持两个不同的主POM文件为您的项目。

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

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