Публикуйте артефакты SNAPSHOT в Maven с помощью IVY - в чем волшебство?

У нас небольшая запутанная ситуация ...

По большей части мы использовали IVY и ANT для управления нашими сборками и зависимостями. Теперь компания движется к использованию Maven. У нас есть набор проектов, называемых общими библиотеками, которые используются несколькими основными продуктами.

Общие библиотеки используют IVY и публикуются в репозитории IVY. Нам также необходимо сделать общие библиотеки доступными для наших новых проектов Maven. Поэтому, когда общие библиотеки создаются и публикуются, я модифицировал сценарий для публикации в Maven (Artifactory), а также в IVY. Вот две цели, которые теперь вызываются при публикации собранных проектов IVY:

<target name="publish-ivyrepo" depends="load-ivysettings">
    <ivy:resolve file="ivy.xml"  /> 
    <ivy:publish 
        module="${ant.project.name}"
        artifactspattern="${dist.dir}/[artifact].[ext]" 
        resolver="integration" 
        pubrevision="${build.version}" 
        status="integration"    
        overwrite="true"
        update="true"/>
</target>

<target name="publish-artifactory" depends="load-ivysettings">
    <ivy:resolve file="ivy.xml"  /> 
    <ivy:publish 
        module="${ant.project.name}"
        artifactspattern="${dist.dir}/[artifact].[ext]" 
        resolver="artifactory" 
        pubrevision="${build.version}-SNAPSHOT" 
        status="integration"    
        overwrite="true"
        update="true"/>
</target>

А вот настройки IVY с подробным описанием резолверов:

<sftp name="integration" checkmodified="true" changingPattern=".*" host="host" user="ivy" userPassword="abc">
  <ivy pattern="${ivy.integration.default.root}/${ivy.public.default.ivy.pattern}"/>
  <artifact pattern="${ivy.integration.default.root}/${ivy.public.default.artifact.pattern}"/>
</sftp>
<url name="artifactory" checkmodified="false" changingPattern=".*" m2compatible="true">
  <ivy pattern="http://server/artifactory/libs-snapshot-local/${maven.default.ivy.pattern}"/>
  <artifact pattern="http://server/artifactory/libs-snapshot-local/${maven.default.artifact.pattern}"/>
</url>

Такого рода работа заключается в том, что теперь я вижу общие библиотеки jar-файлов в Artifactory, в которых SNAPSHOT заменяет уникальную временную метку. Однако исходный jar-файл и XML-файл IVY не заменены SNAPSHOT. Кроме того, файл POM не создается (хотя я не знаю, нужно ли это.

Так что, похоже, это нормально, хотя есть вопросы относительно необходимости файла POM и наименования версии IVY xml и исходного файла jar. Однако, когда я перехожу к указанию зависимости от одного из проектов Maven к одной из версий SNAPSHOT общих библиотечных проектов, он жалуется, что не может разрешить зависимость:

Отсутствует артефакт com.smartstream.common_library: common_library_dao: jar: 4.0.0.5-4-SNAPSHOT: compile

Я попытался указать репозитории для Artifactory через файл POM, и через файл настроек Maven малоуспешно:

<repository>
    <id>test</id>
    <name>simple test</name>
    <url>http://server/artifactory/libs-snapshot</url>
    <releases>
        <enabled>false</enabled>
    </releases>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>

Что странно, если я заставлю IVY опубликовать выпуск, а не SNAPSHOT в локальном репозитории libs-release-local в Artifactory, все будет разрешено, как и следовало ожидать. Кроме того, если я указываю уникальную метку времени как часть версии зависимости (подстановка SNAPSHOT), она также разрешается. Таким образом, это показывает, что проекты Maven могут решить проблему с Artifactory, просто что-то не так с версиями SNAPSHOT.

Я копался везде, почти не надеясь на этот вопрос. Мы будем очень признательны, если вы сможете дать какое-либо понимание.


person AndyF    schedule 14.12.2011    source источник


Ответы (2)


Ответ на публикацию в репозиторий Nexus из ivy был дан здесь:

как публиковать сторонние артефакты с ivy и nexus < / а>

Возможно, этот ответ слишком исчерпывающий. Соответствующий раздел называется «Решение плюща». Я резюмирую это здесь:

Пример

ivy.xml

Вам понадобится раздел публикаций, в котором будет указано, что вы публикуете банку и связанный с ней POM:

<ivy-module version='2.0'>
    <info organisation="com.myspotonontheweb" module="donaldduck"/>

    <publications>
        <artifact name="donaldduck" type="jar"/>
        <artifact name="donaldduck" type="pom"/>
    </publications>

    ..
    ..

</ivy-module>

Примечания:

  • Другой пример более сложен и демонстрирует, как дополнительные артефакты могут быть добавлены в модуль Maven.

ivysettings.xml

Я использую резолверы ibiblio с Maven 2 совместимость включена. По моему опыту, это лучший способ настроить репозиторий Maven в ivy.

<ivysettings>
    <settings defaultResolver="nexus-central"/>
    <credentials host="somehost" realm="Sonatype Nexus Repository Manager" username="????" passwd="????"/>
    <resolvers>
        <ibiblio name="nexus-central" root="http://somehost/nexus/content/repositories/central/" m2compatible="true"/>
        <ibiblio name="nexus-deploy" root="http://somehost/nexus/content/repositories/repo" m2compatible="true"/>
    </resolvers>
</ivysettings>

Примечания:

  • Для artifactory параметр учетных данных realm будет "Artifactory Realm".

build.xml

Наконец, сама логика сборки.

<target name="prepare" description="Generate POM">
    <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/>
    <ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/donaldduck.pom"/>
</target>

<target name="publish" depends="init,build,prepare" description="Upload to Nexus">
    <ivy:publish resolver="nexus-deploy" pubrevision="${publish.revision}" overwrite="true" publishivy="false" >
        <artifacts pattern="${build.dir}/[artifact](-[classifier]).[ext]"/>
    </ivy:publish>
</target>

Примечания:

  • Цель prepare генерирует POM с помощью makepom задача.
  • Задача доставить ivy необязательна, но рекомендуется в если у вас есть какие-либо динамические версии (latest.integration, latest.release) в вашем файле ivy.
  • Цель публикации публикуется на преобразователе nexus-deploy, определенном в вашем файле настроек.
  • Свойство $ {publish.revision} устанавливается в другом месте сборки. Я бы рекомендовал прочитать о задаче buildnumber для ivy.

Примечание об артефакте

Artifactory, похоже, имеет некоторую встроенную поддержку ivy < / а>

person Mark O'Connor    schedule 15.12.2011
comment
Хорошо объяснил, очень помог. Однако это решение по-прежнему не смогло загрузить pom.xml. Для этого мне пришлось добавить <artifact name="donaldduck" ext="pom" type="pom" /> к внутренним элементам цели <ivy:publish>. Это описано здесь: [theholyjava.wordpress. com / 2011/01/26 / using-ivy-with-pom-xml /], но я, честно говоря, не понимаю, как это работает (любопытно, что я создаю pom во вложенной папке, но не должен указывать эта подпапка в элементе <artifact ›) - person rainer198; 07.08.2013
comment
Извините, неправильно отформатирован, закрывающая квадратная скобка не должна быть частью URL-адреса: theholyjava.wordpress.com/2011/01/26/using-ivy-with-pom-xml - person rainer198; 09.08.2013

Если вы уже собираетесь перейти на Maven, я бы посоветовал ознакомиться с задачами Aether Ant, которые заменяют старый (и в настоящее время в значительной степени устаревший) Maven Ant Задачи. Использование этого откроет все необходимые функции обработки зависимостей Maven, необходимые для вашей задачи.

person Manfred Moser    schedule 14.12.2011
comment
К сожалению, задачи Aether ANT до сих пор официально не выпущены, недоступны в Maven Central, кажется, единственный способ получить их - это скомпилировать исходный код github. Старые задачи Maven ANT поддерживают только Maven 2 ..... Таким образом, в настоящее время ivy является лучшим способом взаимодействия с репозиторием Maven, отличным от Maven :-) - person Mark O'Connor; 15.12.2011
comment
Справедливо. Я создал проблему на github с проектом, запрашивающим выпуск. - person Manfred Moser; 16.12.2011