как публиковать 3-х сторонние артефакты с плющом и нексусом - PullRequest
4 голосов
/ 25 февраля 2011

Я усердно промокаю ноги плющом.У меня есть локальный репозиторий Nexus, работающий на моем локальном ПК, и существующий скрипт сборки ant.
Оба работают нормально.

В некоторых сценариях сборки есть несколько файлов для извлечения наших jar-файлов 3-й стороны (log4j, xmlbeans, junit, pdf и т. Д.) Из общего сетевого ресурса - в лучшем случае klunky

Я хочу использовать механизмы зависимости ivy для извлечения этих файлов из репозитория Nexus и использования их в сборке.Каждая 3-я библиотека содержит имя и произвольный набор файлов (jar, dll, license.dat, xml и т. Д.).

Поскольку у нас большое количество этих библиотек 3-й стороны, и у каждой библиотеки есть несколько файлов - вручнуюзагрузка в nexus - это не вариант - мне нужно что-то, что я могу использовать, чтобы взять набор файлов, дать им имя lib, номер версии и загрузить результат в nexus.тогда мне нужно иметь возможность извлечь это из ivy.

Мне удалось заставить загруженную часть работать, но процесс восстановления не работает.Используя нашу библиотеку xmlbeans в качестве отправной точки, я создал следующий файл ivy.xml

<ivy-module version="1.0">  
<info organisation="thirdparty_tools" module="xmlbeans" status="integration">  
<publications>  
  <artifact name="jsr173_api" type="jar" ext="jar"/>  
  <artifact name="saxon-dom" type="jar" ext="jar"/>  
  <artifact name="saxon-xpath" type="jar" ext="jar"/>  
  <artifact name="saxon" type="jar" ext="jar"/>  
  <artifact name="xbean" type="jar" ext="jar"/>  
  <artifact name="xbean_xpath" type="jar" ext="jar"/>  
  <artifact name="xmlpublic" type="jar" ext="jar"/>  
</publications>  
</ivy-module>  

, а затем несколько скриптов ant для его публикации на nexus:

 <ivy:resolve/>  
    <ivy:publish <ivy:publish resolver="thirdparty" forcedeliver="true" update="true" revision="${version}" overwrite="true">  
      <artifacts pattern="[artifact].[ext]"/>  
    <ivy:publish/>  

И все это работает нормально,Он публикует все файлы JAR в Nexus в ожидаемом каталоге.

Проблема возникает, когда я пытаюсь использовать его в моей сборке.Я создал следующий файл ivy.xml для моей сборки:

<ivy-module version="1.0">  
    <info organisation="myCompany" module="GLB_Data"/>  
    <dependencies>  
        <dependency org="thirdparty_tools" name="xmlbeans" rev="2.2.0"/>  
    </dependencies>  
</ivy-module> 

Затем, когда я запускаю свою сборку - ничего не получается:

::::::::::::::::::::::::::::::::::::::::::::::  
::          UNRESOLVED DEPENDENCIES         ::  
::::::::::::::::::::::::::::::::::::::::::::::  
:: thirdparty_tools#jsr173_api;2.2.0: not found  
:: thirdparty_tools#saxon-dom;2.2.0: not found  
:: thirdparty_tools#saxon-xpath;2.2.0: not found  
:: thirdparty_tools#saxon;2.2.0: not found  
:: thirdparty_tools#xbean;2.2.0: not found  
:: thirdparty_tools#xbean_xpath;2.2.0: not found  
:: thirdparty_tools#xmlpublic;2.2.0: not found  
:::::::::::::::::::::::::::::::::::::::::::::: 

Проблема, похоже, заключается в следующемpattern:

WARN: ==== public: tried  
WARN:   http //localhost:8081/nexus/content/groups/public/thirdparty_tools/jsr173_api/2.2.0/jsr173_api-2.2.0.pom  
WARN:   -- artifact thirdparty_tools#jsr173_api;2.2.0!jsr173_api.jar:  
WARN:   http //localhost:8081/nexus/content/groups/public/thirdparty_tools/jsr173_api/2.2.0/jsr173_api-2.2.0.jar  

ivy seems to be looking for the jsr173_api artifact under its own name, rather than under the xmlbeans folder where it was published to:  
[ivy:publish]   published jsr173_api to http //localhost:8081/nexus/content/repositories/thirdparty/thirdparty_tools/xmlbeans/2.2.0/jsr173_api-2.2.0.jar  

(URL-адреса запутаны, чтобы предотвратить несчастные случаи).

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

1 Ответ

14 голосов
/ 25 февраля 2011

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

Поскольку вы сосредоточены на массовой загрузке Nexus, я предлагаю посмотреть на ответ на следующий вопрос:

Загрузка артефактов в Nexus без Maven

Если вы хотите придерживаться плюща, читайте дальше .....

Фон

Требуется POM Maven

Ваша первая проблема заключается в том, что для ваших модулей Maven потребуется файл POM.Этот файл описывает модуль maven и может быть легко сгенерирован из содержимого вашего ivy.xml файла (см. Решение ниже).

Во-вторых, Maven предполагает, что существует one строится основной артефакт.Например:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myspotontheweb</groupId>
  <artifactId>donaldduck</artifactId>
  <version>1.0.1</version>
  <packaging>txt</packaging>
</project>

Клиент Maven преобразует эту информацию в следующий URL-адрес:

http://<host>/<repo>/com/myspotontheweb/donaldduck/1.0.1/donaldduck-1.0.1.txt

Это демонстрирует, как Nexus может хранить бинарные зависимости любого типа.Параметр package по умолчанию равен "jar".

Как maven обрабатывает дополнительные артефакты модуля

Хотя Maven фокусируется на одном артефакте сборки, можно добавить дополнительные дополнительные артефактыразместив их в том же каталоге (как вы сделали).

Это , а не , перечисленные в POM Maven.Вместо этого Maven использует специальный атрибут «классификатор».Ниже приведена возможная декларация зависимости.

<dependency>
  <groupId>com.myspotontheweb</groupId>
  <artifactId>donaldduck</artifactId>
  <version>1.0.1</version>
  <classifier>metadata</classifier>
  <type>n3</type>
</dependency>

Клиент Maven преобразует это в следующий URL:

http://<host>/<repo>/com/myspotontheweb/donaldduck/1.0.1/donaldduck-1.0.1-metadata.n3

Проекты с открытым исходным кодом обычно выпускают свой исходный код таким образом.

Ivy Solution

Итак наконец как можно публиковать файлы в Nexus с помощью ivy?

Прежде всего решите, какой артефакт является "основным" артефактом сборкии добавьте дополнительную запись для вашего файла POM:

<ivy-module version='2.0' xmlns:e="http://ant.apache.org/ivy/extra">

    <info organisation="com.myspotonontheweb" module="donaldduck" revision="1.0.1"/>

    <publications>
        <artifact name="donaldduck" type="txt"/>
        <artifact name="donaldduck" type="pom"/>
        <artifact name="donaldduck" type="n3" e:classifier="metadata"/>
        <artifact name="donaldduck" type="zip" e:classifier="disto"/>
    </publications>

</ivy-module>

Другие файлы также могут быть перечислены, но каждый из них должен иметь уникальный атрибут классификатор ..... Здесь вы столкнетесьс одной из классических проблем при переводе проекта ANT в Maven .... Каждый файл jar, который вы публикуете, вероятно, будет нуждаться в отдельном POM.На самом деле они не являются «дополнительными» артефактами .....

Делая вид, что вам не нужно публиковать несколько модулей .... Используйте следующие цели сборки для публикации вашего модуля:

<target name="prepare" description="Generate POM">
    <!-- Optional: Intermediate file containing resolved version numbers -->
    <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/>

    <!-- Generate the Maven POM -->
    <ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/donaldduck.pom"/>
</target>

<target name="publish" depends="init,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>

учетные данные Nexus

А для полноты вот файл ivysettings.xml , содержащий расположение и учетные данные хранилища Nexus:

<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>

Обновление

ЗагрузкаАртефакты

Для извлечения всех опубликованных артефактов (не только основного), вы должны перечислить их следующим образом:

<dependency org="com.myspotontheweb" name="donaldduck" rev="1.0.1">
    <artifact name="donaldduck" type="txt"/>
    <artifact name="donaldduck" type="n3" e:classifier="metadata"/>
    <artifact name="donaldduck" type="zip" e:classifier="distro"/>
</dependency>

Функционально аналогично следующемуMaven фрагмент:

<dependency>
  <groupId>com.myspotontheweb</groupId>
  <artifactId>donaldduck</artifactId>
  <version>1.0.1</version>
  <type>txt</type>
</dependency>

<dependency>
  <groupId>com.myspotontheweb</groupId>
  <artifactId>donaldduck</artifactId>
  <version>1.0.1</version>
  <classifier>metadata</classifier>
  <type>n3</type>
</dependency>

<dependency>
  <groupId>com.myspotontheweb</groupId>
  <artifactId>donaldduck</artifactId>
  <version>1.0.1</version>
  <classifier>distro</classifier>
  <type>zip</type>
</dependency>
...