Как создать несколько артефактов Maven из одного источника - PullRequest
4 голосов
/ 14 апреля 2011

Я понимаю, что это противоречит лучшим практикам maven, но, возможно, моя ситуация - одно из немногих исключений из правила - по крайней мере, я застрял в размышлениях об альтернативах: (

Среда такая:

  • у нас есть устаревшее приложение с интерфейсами на основе запатентованной технологии для внешнего мира
  • мы хотим использовать flash как новый интерфейс
  • на основе унаследованного интерфейса мы генерируем флэш-классы и упаковываем их во флэш-SWC для использования разработчиками внешнего интерфейса
  • на основе унаследованного интерфейса мы генерируем Java-классы, которые соединяют запросы службы флэш-памяти (поступающие через блейзиды) с нашим унаследованным интерфейсом
  • чтобы сделать его более сложным, мы не хотим / не можем использовать pom отдельно для каждого интерфейса, так как у нас их десятки (интерфейсы), и они будут различаться только по их artifactId. Вместо этого я использую «общую» структуру проекта, которая будет параметризована (jenkins) для каждой сборки. Проект будет только использоваться в полностью автоматизированной среде.

Сначала я попытался объединить все это в один «простой» проект, который работает до того момента, когда артефакты должны быть установлены.

Мой текущий подход - это многомодульная структура проекта, основанная на справочной главе maven, которая имеет некоторые недостатки:

GenericProject
|
+-- GenerateSources from legacy interface
|   +-- pom.xml
|
+-- Java 
|   +-- pom.xml
|
+-- SWC 
|   +-- pom.xml
|
+-- pom.xml

Недостатком этого подхода является то, что у меня есть ссылки из "Java" и "SWC" на внутреннюю структуру "GenerateSource", которая уродлива, но терпима.
Что мне действительно мешает - это то, что мне нужно сильно подправить плагины установки и развертывания, чтобы получить артефакты с именем и версией устаревшего интерфейса, который запустил весь процесс. Я запустил его сейчас, но он выглядит очень хрупким.

Я рассмотрел разделение / дублирование проекта на два простых проекта:

  • GenerateSources & Java
  • GenerateSources & SWC

Но это только решило бы небольшое раздражение с помощью перекрестных ссылок.

Как отметил Аарон в своем комментарии, я неясно сформулировал проблему. После еще нескольких экспериментов мне стало намного понятнее: По сути, мне нужно решить две проблемы

  1. установить / развернуть два артефакта вместе
  2. Назовите артефакты, отличные от project.artifactId

Любые предложения, чтобы сделать весь процесс более похожим на maven?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 18 апреля 2011

После нескольких обходов с многомодульным подходом я пришел к следующему прагматическому решению:

  1. используйте build-helper-plugin, чтобы автоматически прикрепить дополнительный артефакт для установки / развертывания
  2. двухфазная сборка:

    2.1 генерирует pom.xml через sed, который содержит разрешенные project.artifactId & project.version

    2.2 запустить сборку maven

Хотя теоретически вы можете использовать выражения как project.artifactId & project.version, maven предупреждает вас об этом. , , по уважительной причине: Когда вы попытаетесь сослаться на произведенные артефакты, nexus выдаст вам «Не удалось прочитать дескриптор артефакта для ...» ошибка. Я подозреваю, что это потому, что в сохраненном pom в хранилище выражения не разрешены!

2 голосов
/ 15 апреля 2011

Вы должны написать небольшой плагин Maven, который вы присоединяете к фазе generate-sources.См. Пример maven-annotation-plugin ( основной класс ).

Это будет включать сгенерированные источники в выходные данные GenerateSource, и вы можетеиспользовать эти классы, просто включив зависимость в другие POM.Обратите внимание, что вы должны создавать эти файлы в target/, а не в src/.

Что касается установки / развертывания: эти плагины получают свои имена от плагинов, которые создают артефакты.Так что должно быть что-то не так с тем, как вы устанавливаете свойство.В вашем случае это плагин JAR .В документации есть пример того, как установить имя артефакта по умолчанию .

1 голос
/ 15 апреля 2011

Попробуйте использовать наложения Maven, они используются для совместного использования ресурсов между несколькими веб-приложениями.

http://maven.apache.org/plugins/maven-war-plugin/overlays.html

...