Как заставить Айви скачать исходники из репозитория Nexus

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

У меня есть библиотека, которую я собираю с помощью ant, которая выводит 2 jar-файла, один из которых, как обычно, содержит скомпилированную версию библиотеки, а другой - только исходные файлы.

Эта библиотека загружена в наш репозиторий Nexus с упаковкой jar. Для самого файла jar я установил расширение на jar и оставил классификатор пустым. Для исходного jar я установил классификатор для источников и расширение для jar.

Независимо от того, что я делаю с моим файлом ivy.xml, я не могу получить его для загрузки JAR-файла с исходным кодом. Основываясь на сообщениях, которые я читал в другом месте, я попытался добавить:

conf="*->default,sources"

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

configuration not found in org#name;version: 'sources'

Так что это в основном ожидает, что моя библиотека определит источники как конфигурацию где-нибудь? Я думал, что это просто уловит тот факт, что есть другой артефакт с установленным в хранилище классификатором источников.

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

Это основной файл Ivy.xml, в котором я определяю свою зависимость от библиотеки, которую я поместил в Nexus.

<ivy-module version="2.0">

    <info organisation="${ivy.organisation}" module="moduleName" />

    <configurations>
        <conf name="pda" description="moduleName for PDA"/>
        <conf name="server" description="moduleName for server"/>
    </configurations>

    <dependencies>
        <!-- Internal -->
        <dependency name="utility" org="${ivy.organisation}" rev="latest.integration" conf="${ivy.configuration}"/>
        <dependency name="myLib" org="my.org" rev="0.0.+"/>
    </dependencies>

</ivy-module>

В ответ на комментарии ниже свойство ivy.configuration установлено в pda в моем build.properties для Ant. Для Eclipse я создал файл свойств и также установил для ivy.configuration значение pda (на этот файл свойств затем ссылаются в настройках Ivy в Eclipse).

Я получаю сообщение об ошибке:

Some projects fail to be resolved
    Impossible to resolve dependencies of ${ivy.organisation}#moduleName;working@host
        unresolved dependency: my.org#myLib;0.0.+: configuration not found in my.org#myLib;0.0.0: 'sources'. It was required from ${ivy.organisation}#moduleName;working@host pda

ОБНОВЛЕНИЕ Вот разрешенный файл ivy.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
    <info organisation="my.org"
        module="myLib"
        revision="0.0.0"
        status="release"
        publication="20120419131909"
        default="true"
    />
    <configurations>
        <conf name="default" visibility="public"/>
    </configurations>
    <publications>
        <artifact name="myLib" type="jar" ext="jar" conf="default"/>
    </publications>
</ivy-module>

Это, очевидно, объясняет, почему не удается найти "источники" конф. Но у меня сложилось впечатление, что исходники conf должны быть добавлены автоматически, потому что я добавил источники в Nexus.

3 ответа

Решение

Так что после долгих тренировок у меня, похоже, наконец-то есть решение. Если я объявлю свою зависимость следующим образом:

<dependency name="myLib" org="my.org" rev="0.0.+">
    <artifact type="jar"/>
    <artifact type="source" m:classifier="sources" conf="pdaDev->sources"/>
</dependency>

Затем я могу добавить новый конфиг (например, pdaDev выше), который ссылается на исходный конфиг зависимости. При использовании Eclipse я могу сказать ему использовать конфигурацию pdaDev, и он также извлекает исходный файл (если он существует).

Кажется странным, что Nexus, кажется, не включает конфигурацию исходных кодов в разрешенный файл Ivy, если он явно не запрашивается, как я делал выше.

Вы должны сообщить Ivy о конфигурациях, когда публикуете артефакты. Например:

<ivy-module version="2.0">
    <info organisation="apache" module="commons-lang" revision="2.5" status="release"/>
    <configurations>
        <conf name="binary" description="provide only binary files"/>
        <conf name="development" extends="binary" description="provide binary files with javadoc and sources"/>
    </configurations>
    <publications>
        <artifact name="commons-lang" ext="jar" conf="binary" type="jar"/>
        <artifact name="commons-lang-javadoc" ext="jar" conf="development" type="javadoc"/>
        <artifact name="commons-lang-sources" ext="jar" conf="development" type="source"/>
    </publications>
</ivy-module>

Как видите, commons-lang.jar публикуется в бинарной конфигурации. Но commons-lang-sources и commons-lang-javadoc опубликованы в стадии разработки.

При получении зависимостей вы должны использовать следующий файл ivy.xml:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info organisation="bitrete" module="strongpoint" status="development"/>
    <configurations>
        <conf name="binary" description="provide only binary files"/>
        <conf name="development" extends="binary" description="provide binary files with javadoc and sources"/>
    </configurations>
    <publications>
        <artifact name="strongpoint" ext="jar" type="jar"/>
    </publications>
    <dependencies>
        <dependency org="apache" name="commons-lang" rev="2.5"/>
    </dependencies>
</ivy-module>

и предоставьте желаемую конфигурацию при разрешении с помощью Ant:

<property name="ivy.conf" value="binary"/>
...
<property name="ivy.conf" value="development"/>
...
<ivy:resolve conf="${ivy.conf}"/>

Создайте две конфигурации в вашем файле плюща. Один для двоичных файлов, которые должны быть на вашем пути к классам, другой для исходных файлов.

Во-вторых, создайте два сопоставления конфигурации на зависимости:

<ivy-module version="2.0">
    <info organisation="org.demo" module="demo"/>
    <configurations>
        <conf name="compile" description="jars used for compilation classpath"/>
        <conf name="sources" description="Source jars"/>
    </configurations>
    <dependencies>
        <dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="compile->default;sources->sources"/>
    </dependencies>
</ivy-module>

НОТА:

В вашей сборке ANT вы можете использовать следующие конфигурации:

<target name="init">
    <ivy:resolve/>

    <!-- Populate a compile classpath for use with javac task -->
    <ivy:cachepath pathid="compile.path" conf="compile"/>

    <!-- Put source jars in the src directory -->
    <ivy:retrieve pattern="src/[artifact]-[revision](-[classifier]).[ext]" conf="sources"/>

</target>
Другие вопросы по тегам