Maven: выбор родительского проекта на основе профиля - PullRequest
3 голосов
/ 28 июня 2011

У меня есть проект Maven - это плагин для Дженкинса.Его родитель должен быть:

<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 разных профиля для этого и использовать их для создания плагина для Дженкинса или Хадсона соответственно?Так что я вызываю что-то вроде этого:

mvn package -P jenkins

или

mvn package -P hudson

Я попытался указать свойства в профилях, но они не заменяются их значениями внутри тега <parent>,Так есть ли какая-нибудь другая возможность создать плагин для обоих, но с максимально возможным общим кодом и файлами?

Добавлено : Итак, если я не могу этого сделать, что мне делать потом?Как провести рефакторинг?Какой должна быть новая структура?

Ответы [ 6 ]

2 голосов
/ 29 июня 2011

Как уже упоминалось, это невозможно.Кроме того, невозможно установить свойство для родительской версии, поскольку интерполяция для этого происходит намного раньше, чем обработка профилей.

Я бы предложил создать проект masterbuild следующим образом:

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

Мастер должен построить все три как обычно.Однако в сборке вы можете добавить каждый из двух плагинов в качестве зависимостей в отдельные профили.И ... у каждого из этих плагинов может быть родитель, который вам нравится.

Это, очевидно, несколько отклонение от соглашения Maven, но я считаю, что это решение вашей проблемы.

1 голос
/ 29 июня 2011

Это невозможно, потому что тег "родитель" недоступен в разделе профилей пом.

0 голосов
/ 10 декабря 2015

В общем, вы должны иметь возможность установить Id {group, artifact} и версию родительского POM через Свойства системы Java или Переменные среды, но, похоже, в Maven есть ошибка, которая будет исправлена ​​только в 4. Икс: https://issues.apache.org/jira/browse/MNG-624

Другое решение состоит в том, чтобы делегировать включение родительского POM в ваши собственные родительские POM, на которые вы ссылаетесь в элементlativePath, и изменить содержимое цели, например. с помощью символической ссылки или команды 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>

Та же информация о проекте с блоком для hudson, которую вы поместили в 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 не существует в месте, указанном в относительном пути, Maven будет искать POM в удаленном хранилище [1], что также является простым способом локальной перезаписи родительского POM.

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

0 голосов
/ 14 июля 2011

В настоящее время мы решили использовать 1 репозиторий и 2 отдельных файла pom.xml, предоставив ключ maven, который pom.xml использует для создания проекта.

mvn package -f pom-jenkins.xml
mvn package -f pom-hudson.xml
0 голосов
/ 28 июня 2011

Как уже упоминалось, уже невозможно. Я бы предложил сделать отдельные проекты для плагина jenkins и плагина hudson. Я предполагаю, что в недалеком будущем это не сработает, потому что Хадонс и Дженкинс расходятся.

0 голосов
/ 28 июня 2011

Нет, вы не можете этого сделать. вам придется как-то рефакторинг, чтобы избежать необходимости.

...