9 сент. 2009 г.

Apache Ivy - The agile dependency manager

Apache Ivy - шустрый и гибкий инструмент разрешения зависимостей (java) библиотек.
Среди преимуществ:
  • полная интеграция с Apache Ant - что не удивительно, т.к. ivy развивается в рамках этого проекта
  • IvyDe - plugin для eclipse
  • ivyidea - plugin для jetBrains Idea
1. Настройка Опишем файл настроек для ivy - будем использовать расположение по-умолчанию ~/.ivy2/ivysettings.xml:
<?xml version="1.0" encoding="utf-8"?>
<ivysettings>
<settings defaultCache="${user.home}/.ivy2/cache" defaultResolver="ibiblio"/>
<resolvers>
<url name="ibiblio" m2compatible="true">
<artifact pattern="http://www.ibiblio.org/maven2/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"/>
</url>
</resolvers>
</ivysettings>
В качестве cache используем один единственный ~/.ivy2/сache/ и единственный (публичный) ibiblio resolver

Замечание 1. Можно организовывать цепочку (chain) из resolver'ов - подробнее см.документацию
Замечание 2.. Существуют различные resolver'ы способные забирать не только с web-серверов (url resolver), но и ssh resolver - по ssh, vfs resolver - как локальные фс (в т.ч и zip, tar, bzip2, gzip), так и сетевые - ftp, smb, webdav.

2. Зависимости проекта
Теперь опишем сами зависимости для небольшого проекта:
<?xml version="1.0" encoding="ISO-8859-1"?>
<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="org.home" module="misc" status="integration" />

<dependencies>
<dependency org="org.springframework" name="spring" rev="2.5.6" />
<dependency org="junit" name="junit" rev="4.4"/>
<dependency org="log4j" name="log4j" rev="latest.integration"/>
</dependencies>
</ivy-module>
Замечание 3. Зависимость может описывать не только jar-файлы, но архивы с исходным кодом, javadocs и т.п.

3. Поиск зависимостей.
Т.к. мы решили использовать публичный репозиторий ibiblio, будем разрешать зависимости используя его - найти нужную зависимость можно с помощью, например, Maven Repository (чего там только нет - на момент написания статьи около 50,000 библиотек): Для этого, необходимо POM Dependency
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
переписать в виде ivy dependency:
<dependency org="groupId" name="artifactId" rev="version" />
т.е
<dependency org="org.springframework" name="spring" rev="2.5.6" />
Замечание 4. Создавая собственные репозитории необходимых библиотек, вы можете использовать различные конфигурации зависимостей. Дабы не возникало конфликтов из-за разных конфигураций разных репозиториев - лучше использовать собственные кэши для каждого репозитория.

p.s. не стоит рассматривать ivy как конкурента и/или замену maven'у - это «немного» разные вещи - скорее тандем ant + ivy можно рассматривать как такую альтернативу.

5 комментариев:

Анонимный комментирует...

А насколько такой тандем шустрее/гибче того же maven`а? Скажем, если я использую maven, стоит ли мне пробовать эту штуку с перспективой "пересесть на неё"?

Vladimir Dolzhenko комментирует...

@folone:
при моём беглом знании maven'а мне кажется ivy+ant легче и гибче, по заверению коллег, знакомых с maven значительно лучше - они не хотели бы возвращаться к maven'у.
на мой взгляд, без видимых причин резко мигрировать с одной методологии сборки на другую не стоит.

Анонимный комментирует...
Этот комментарий был удален администратором блога.
Анонимный комментирует...

Разница немного в другом. Айви привносит в ант управление зависимостями. Оно не меняет саму императивную парадигму анта. В то время как мавен имеет декларативную парадигму.

buy viagra комментирует...
Этот комментарий был удален администратором блога.