Статьи

Использование плюща с pom.xml

Можно использовать Apache Ivy с зависимостями, определенными в pom.xml, вместо его собственного ivy.xml, но вам нужно будет применить некоторые обходные пути, и вы потеряете доступ к некоторым функциям, которые вам могут (или могут не понадобиться). Проблема в том, что в POM вы можете предоставить только поднабор настроек, доступных в ivy.xml, и что Ivy понимает только подмножество синтаксиса POM.

Информация здесь в основном основана на Ivy 2.1.0.

Отказ от ответственности: я не эксперт Айви, и, конечно, есть лучшие способы добиться того, что я сделал. Также более новые версии Ivy могут быть лучше.

Ограничения использования pom.xml

Айви понимает только подмножество синтаксиса POM: зависимости, зависимости плагинов или st. вот так, родительский модуль.

Чтобы точно узнать, какие части файла pom.xml обрабатываются Ivy, проверьте два основных класса, ответственных за это (версия 2.1.0): PomModuleDescriptorParser.java и PomReader.java .

Проблемы и решения

Ссылаясь на родительский POM

В общем, вы можете использовать родительский POM, например, объявить свойства, которые вы затем используете, например, в объявлениях зависимостей, но есть несколько проблем с родительскими POM:

  1. Плющ игнорирует элементlativePath
  2. Плющ игнорирует упаковку = пом в родительском модуле

Плющ игнорирует элементlativePath

Вы можете указать родительский проект в своем POM. Maven позволяет вам указать абсолютный или относительный системный путь к pom следующим образом:

Но Айви будет игнорировать относительный путь и будет пытаться найти его только через распознаватель (что может быть хорошо для вас, но не для меня).

<parent>
<groupId>com.ibm.education</groupId>
<artifactId>lms-root-pom</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../lms.build/lms-root-pom/pom.xml</relativePath>
</parent>
Временное решение
  1. Объявите специальный локальный преобразователь файловой системы для родительского pom
  2. Сконфигурируйте модули в ivysettings, чтобы этот распознаватель использовался только для родительского модуля pom

Специальный резольвер FS для родительского pom:

<ivysettings>
<resolvers>
<filesystem name="local-lms.build" force="true" descriptor="required">
<ivy pattern="${ivy.settings.dir}/[module]/pom.xml" />
<artifact pattern="${ivy.settings.dir}/[module]/emptyJarToSatisfyIvy.jar" />
</filesystem>
...
</resolvers>
</ivysettings>

(ivy.settings.dir автоматически устанавливается Ivy на основе атрибута файла задачи ivy: settings; просто убедитесь, что используется file =, а не url =)

Объявление модуля:

<ivysettings>
...
<modules>
<module organisation="com.ibm.education" name="lms-root-pom" resolver="local-lms.build"/>
...
</modules>
</ivysettings>

Структура файла:

  • lms.build

    • Пленки-корень-П

      • pom.xml
      • emptyJarToSatisfyIvy.jar (см. ниже)
  • ваш-зависимый модуль

    • pom.xml

Плющ игнорирует упаковку = пом в родительском модуле

Айви игнорирует package = pom в родительском модуле и всегда будет пытаться найти .jar для него, тратя впустую драгоценное время. Обходной путь — создать поддельный пустой .jar, например, через echo «»> emptyJarToSatisfyIvy.jar. Вы можете увидеть это выше в структуре файла lms-root-pom и в конфигурации преобразователя.

Публикация pom.xml в репозитории Maven и соблюдение зависимостей ваших собственных модулей

Я предполагаю, что вы хотите опубликовать свои собственные модули в менеджере репозитория Maven, например, в Nexus или Artifactory. И вы также хотите опубликовать pom.xml модуля с его зависимостями, и когда у вас есть другой модуль, зависящий от этого, вы хотите, чтобы Айви знал о (транзитивных) зависимостях от pom.

Публикация pom.xml

Обычно Айви публикует только один артефакт <имя модуля>. <Упаковка>. Если вы использовали ivy.xml, вы могли бы объявить дополнительные артефакты в его <публикациях> / <артефакте>, однако pom.xml не дает вам такой возможности.

К счастью, начиная с Ivy 2.2.0 , дополнительные артефакты можно объявлять с помощью элемента <artifact> также в рамках задачи Ant ivy: publish :

<ivy:publish resolver="shared-snapshot"
pubrevision="${ivy.revision}" forcedeliver="true"
status="integration" overwrite="true">

<artifacts pattern="${artifactspattern}" />
<artifacts pattern="pom.xml" />

<!-- Additional artifacts to publish (since Ivy 2.2.0): -->
<artifact name="${ivy.module}" ext="pom" type="pom" />
</ivy:publish>

Важно, чтобы имя артефакта POM было <artifactId> — <version> .pom, в противном случае он не будет распознан как POM артефакта при получении. Это достигается с помощью предоставленных Ivy свойств ivy.module и ext = pom. Атрибуты ivy: publish в основном не важны, они у меня такие, потому что они используются для публикации снимков.

Настройка Ivy для получения POM и уважения зависимостей

Ivy автоматически учитывает зависимости в POM, но он должен знать, что должен искать этот файл. Для этого вы должны использовать ibiblio resolver для извлечения артефактов из хранилища. И, конечно же, должен быть файл <artifactId> — <version> .pom рядом с основным .jar. Но он не поддерживает публикацию (по крайней мере, я так полагаю), и поэтому вам также необходимо объявить распознаватель URL для публикации ваших артефактов:

<ivysettings>
<property name="upload.root.url" value="http://e25ciwas020.toronto.ca.ibm.com:8081/nexus/content/repositories" />
...
<resolvers>
<chain name="shared">
<ibiblio name="shared-snapshot-retrieval" m2compatible="true" root="${upload.root.url}/snapshots" />

<url name="shared-snapshot" m2compatible="true">
<artifact pattern="${upload.root.url}/snapshots/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
</url>
</chain>
</resolvers>
</ivysettings>

Чтобы проверить это, загляните в /.ivy2/cache// — там должен быть ivy-.xml .original, который на самом деле является переименованным pom.xml и ivy- <version> .xml, сгенерированным из этого.

Особенно загляните в ivydata- <version> .xml, он содержит информацию о метаданных артефакта и т. Д. В идеальном случае он похож на:

#ivy cached data file for com.ibm.education#lms.ab.common;40.0.0-SNAPSHOT
#Wed Jan 26 12:11:17 CET 2011
artifact\:lms.ab.common\#jar\#jar\#-869122099.is-local=false
artifact.resolver=shared-snapshot-retrieval
artifact\:lms.ab.common\#pom.original\#pom\#783440563.location=http\://e25ciwas020.toronto.ca.ibm.com\:8081/nexus/content/repositories
/snapshots/com/ibm/education/lms.ab.common/40.0.0-SNAPSHOT/lms.ab.common-40.0.0-SNAPSHOT.pom
artifact\:lms.ab.common\#pom.original\#pom\#783440563.is-local=false
artifact\:lms.ab.common\#jar\#jar\#-869122099.location=http\://e25ciwas020.toronto.ca.ibm.com\:8081/nexus/content/repositories
/snapshots/com/ibm/education/lms.ab.common/40.0.0-SNAPSHOT/lms.ab.common-40.0.0-SNAPSHOT.jar
resolver=shared-snapshot-retrieval
artifact\:ivy\#ivy\#xml\#1489462886.is-local=false
artifact\:ivy\#ivy\#xml\#1489462886.location=http\://e25ciwas020.toronto.ca.ibm.com\:8081/nexus/content/repositories
/snapshots/com/ibm/education/lms.ab.common/40.0.0-SNAPSHOT/lms.ab.common-40.0.0-SNAPSHOT.pom

Отображение конфигураций (областей)

В то время как Ivy позволяет вам определять, какие зависимости следует выбирать, в какой ситуации, включая транзитивную, чтобы вы могли легко объявить, что «предоставленные» зависимости должны соблюдаться во время компиляции и тестирования, с pom.xml вы теряете возможность объявлять эти конфигурации. сопоставления и вы должны жить по умолчанию. Это означает, например, что зависимости зависимости с предоставленной областью действия = всегда игнорируются. Решение состоит в том, чтобы использовать только scope = compile для зависимостей в ваших модулях / артефактах, которые следует использовать повторно, и вручную отфильтровывать зависимости, которые вы не хотите включать в ваш двоичный файл (например, .war).

Вывод

Можно использовать Ivy 2.2.0 с Maven POM, но вы должны тщательно изучить ограничения этого подхода и проверить их на соответствие вашим требованиям. Удачи!

 

От http://theholyjava.wordpress.com/2011/01/26/using-ivy-with-pom-xml/