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>

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

mvn package -P jenkins

或者

mvn package -P hudson

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

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

4

6 回答 6

2

如前所述,这是不可能的。此外,无法为父版本设置属性,因为插值发生在配置文件处理之前很多。

我建议您创建一个 masterbuild 项目,如下所示:

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

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

这显然与 Maven 约定有些偏差,但我相信它可以解决您的问题。

于 2011-06-29T10:20:08.400 回答
1

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

mvn package -f pom-jenkins.xml
mvn package -f pom-hudson.xml
于 2011-07-14T10:01:22.030 回答
1

这是不可能的,因为 pom.xml 的配置文件部分中没有标签“父”。

于 2011-06-29T09:15:23.410 回答
0

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

于 2011-06-28T15:28:02.380 回答
0

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

于 2011-06-28T13:19:54.020 回答
0

一般来说,您应该能够通过 Java 系统属性或环境变量设置父 POM 的 {group,artifact}Id 和版本,但似乎 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>

在 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 将在远程存储库中查找 POM [1],这也是在本地覆盖父 POM 的一种简单方法。

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

于 2015-12-10T00:01:41.697 回答