Решение Ivy не работает с динамическим артефактом - PullRequest
4 голосов
/ 01 мая 2010

Я немного пользуюсь Ivy, но мне, похоже, еще есть чему поучиться.

У меня есть два проекта. Один - это веб-приложение, а другой - библиотека, от которой зависит веб-приложение. Установлено, что проект библиотеки компилируется в файл jar и публикуется с использованием Ivy в каталог внутри проекта. В файле сборки веб-приложения у меня есть цель ant, которая вызывает задачу Ant Ivy Resolution.

Мне бы хотелось, чтобы веб-приложение использовало режим динамического разрешения во время разработки (на локальных компьютерах разработчика) и режим разрешения по умолчанию для тестовых и производственных сборок. Ранее я добавлял метку времени в файл архива библиотеки, чтобы Айви заметила изменения в файле, когда веб-приложение попыталось разрешить свою зависимость от него. В Eclipse это громоздко, потому что в веб-приложении проект должен был обновляться, а путь сборки корректировался при каждой публикации новой библиотеки библиотеки. Я полагаю, что для публикации jar-файла с аналогичным именем каждый раз требуется только обновление проекта разработчиками.

Проблема в том, что веб-приложение не может получить динамический файл JAR.

Вывод, который я получаю, выглядит примерно так:

resolve:
[ivy:configure] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ ::
[ivy:configure] :: loading settings :: file = /Users/richard/workspace/webapp/web/WEB-INF/config/ivy/ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.webapp#webapp;working@hoth-3.local
[ivy:resolve]   confs: [default]
[ivy:resolve]   found com.webapp#library;latest.integration in local
[ivy:resolve] :: resolution report :: resolve 142ms :: artifacts dl 0ms
---------------------------------------------------------------------
|                  |            modules            ||   artifacts   |
|       conf       | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
|      default     |   1   |   0   |   0   |   0   ||   0   |   0   |
---------------------------------------------------------------------
[ivy:resolve] 
[ivy:resolve] :: problems summary ::
[ivy:resolve] :::: WARNINGS
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       ::          UNRESOLVED DEPENDENCIES         ::
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       :: com.webapp#library;latest.integration: impossible to resolve dynamic revision
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :::: ERRORS
[ivy:resolve]   impossible to resolve dynamic revision for com.webapp#library;latest.integration: check your configuration and make sure revision is part of your pattern
[ivy:resolve] 
[ivy:resolve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

BUILD FAILED 
/Users/richard/workspace/webapp/build.xml:71: impossible to resolve dependencies:
resolve failed - see output for details

Цель разрешения веб-приложения выглядит следующим образом:

<target name="resolve" depends="load-ivy">
    <ivy:configure file="${ivy.dir}/ivysettings.xml" />

    <ivy:resolve 
        file="${ivy.dir}/ivy.xml" 
        resolveMode="${ivy.resolve.mode}"/>

    <ivy:retrieve pattern="${lib.dir}/[artifact]-[revision].[ext]" type="jar" sync="true" />
</target> 

В этом случае ivy.resolve.mode имеет значение «dynamic» (без кавычек).

Файл Ivy веб-приложения прост. Это выглядит так:

<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="com.webapp" module="webapp"/>

    <dependencies>
        <dependency name="library" rev="${ivy.revision.default}" revConstraint="${ivy.revision.dynamic}" />
    </dependencies>

</ivy-module>

Во время разработки ivy.revision.dynamic имеет значение «latest.integration». В то время как во время производства или тестирования ivy.revision.default имеет значение 1.0.

Есть идеи? Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 июня 2010

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

Anwyay, в settings.xml я добавил:

 <modules>
     <module organisation="my.organisation" name="*" resolveMode="dynamic"/>
 </modules>

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

Кроме того, к решателям я добавил checkModified и changingPattern.Очевидно, что это важно сделать как для фактического распознавателя, так и для цепочки оберток (если она у вас есть):

<chain name="foo" checkmodified="true"  changingPattern=".*-SNAPSHOT">
    <url name="bar" checkmodified="true" changingPattern=".*-SNAPSHOT">  
       <ivy pattern=... />  
       <artifact pattern=... /> 
    </url>  
    ...
</chain>

Надеемся, что checkModified делает то, что говорит на жестяной коробке.И я понял, что changingPattern сообщает ivy, чтобы проверить, есть ли у артефактов, содержащих этот шаблон, новое обновление в репо.Я лично использую репозиторий Maven, где к изменяемым вещам всегда добавляется -SNAPSHOT, поэтому я использую это (я думаю, довольно часто).Я думаю, вы могли бы заменить это changingPattern на ". *" Или что-то, что подходит вам лучше.

3 голосов
/ 03 мая 2010

Я думаю, вам нужно отказаться от использования атрибута revConstraint в файле плюща вашего веб-приложения.

Айви считает, что «latest.revision» - это ревизия, которую вы хотите получить, вместо того, чтобы искать последнюю ревизию: -)

Я бы рекомендовал просто установить зависимость следующим образом:

<dependency name="library" rev="latest.integration"/>

Пояснение:

revConstraint устанавливается при публикации модуля. Он записывает последнюю редакцию на момент публикации. Так что вам это не нужно во время разработки. Также вам не нужно использовать переменную ревизии. Когда вы публикуете модуль ivy с ревизией «latest.revision» или «latest.release», ссылка на него разрешается и записывается в атрибуте revConstraint .

См. Следующую ссылку для получения дополнительной информации:

http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html#revision-constraint

...