Maven:基于配置文件选择父项目

4

我有一个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>

我可以为此指定两个不同的配置文件,并使用它们来构建适用于Jenkins或Hudson的插件吗?这样我就可以像这样调用:
mvn package -P jenkins

或者

mvn package -P hudson

我尝试在配置文件中指定属性,但这些属性在 <parent> 标签内部没有被它们的值替换。那么是否还有其他可能性可以为两者构建插件,但尽可能多地共享代码和文件?

补充: 那么,如果我不能这样做,我该怎么办呢?如何重构?新结构应该是什么样的?

6个回答

2

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

我建议您创建一个主构建项目,步骤如下:

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

主工程应像往常一样构建所有三个模块。然而,在组装过程中,您可以将这两个插件分别作为依赖项添加到单独的配置文件中。并且......这些插件都可以有您喜欢的父级。

这显然是与Maven惯例有所偏差,但我相信这是解决您问题的一个方法。


谢谢,我会试试的。但这样的话,我必须在插件-杰金斯和插件-哈德森中都拥有2份代码副本。能否以某种方式进行操作,使我可以基于杰金斯的代码或基于哈德森的代码来构建另一个平台? - Draco Ater
我建议你为这个项目(至少)拆分成两个独立的项目进行打包。就像Karl-Heinz在下面指出的,Hudson和Jenkins已经分道扬镳,现在(仍然)能工作的东西可能在不久的将来就无法工作了。 你可以将大部分代码放在核心模块中,然后将Hudson或Jenkins特定的内容放在打包模块中(该模块依赖于核心模块)。 按照这种方式做应该可以解决你的问题。 - carlspring

1

目前我们决定坚持使用1个代码库和2个独立的pom.xml文件,通过提供Maven关键字来指定使用哪个pom.xml文件来构建项目。

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

1
通常情况下,您应该能够通过Java系统属性或环境变量设置父POM的{group,artifact}Id和版本,但是似乎Maven中存在一个Bug,只有在4.x中才会修复: https://issues.apache.org/jira/browse/MNG-624 另一种解决方案是将父POM的包含委托给您自己的父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


1

这是不可能的,因为在pom文件的profiles section中没有可用的"parent"标签。


0

不,你不能这样做。你必须进行重构以避免这种必要性。


0

如前所述,这是不可能的。我建议为Jenkins插件和Hudson插件创建单独的项目。我认为在不久的将来,这种方法将不再适用,因为Hudons和Jenkins将分道扬镳。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接