Публиковать артефакты SNAPSHOT в Maven, используя IVY - что за магия? - PullRequest
4 голосов
/ 14 декабря 2011

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

По большей части мы использовали 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 и файл IVY xml не имеют замещенной SNAPSHOT. Кроме того, POM-файл не создается (хотя я не знаю, если это необходимо.

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

Отсутствует артефакт com.smartstream.common_library: common_library_dao: jar: 4.0.0.5-4-SNAPSHOT: скомпилировать

Я пытался указать репозитории для 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.

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

Ответы [ 2 ]

7 голосов
/ 16 декабря 2011

Публикация в репозитории Nexus от ivy дана здесь:

как публиковать артефакты 3-го участника с помощью ivy и nexus

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

Пример

ivy.xml

Вам понадобится раздел публикаций, в котором будет указано, что вы публикуете jar и связанный с ним 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>

Примечания:

  • Для артефакта параметр учетных данных 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 delivery является необязательной, но рекомендуется, если в вашем файле плюща есть динамические ревизии (latest.integration, latest.release).
  • The publish target публикует в распознаватель nexus-deploy , определенный в вашем файле настроек.
  • Свойство $ {publish.revision} установлено в другом месте всборка.Я бы порекомендовал прочитать о buildnumber задачи ivy

Заметка об артефакте

Artifactory, кажется, имеет некоторую встроенную поддержку для ivy

0 голосов
/ 15 декабря 2011

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

...