Как заставить Айви скачать исходники из репозитория 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>
НОТА:
- Модули Maven переведены ivy, чтобы иметь стандартный набор конфигураций. Для получения более подробной информации см. Как области maven сопоставляются с конфигурациями плюща ivy
В вашей сборке 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>