Apache Ivy

Познакомтесь Apache Ivy очень интересный проект для программистов Java. В чем его интересность - он позволяет разработчику управлять зависимостями java библиотек при компиляции и развертывании java приложений т.е. автоматизировать сборку приложения в области закачки нужных вам java библиотек. Ivy тесно интегрирован с проектом Apache Ant - java-утилитой для автоматизации процесса сборки java приложений. В принципе как я понял из документации Ivy можно использовать и отдельно без ant, но куда интереснее в связке с Ant. При работе над проектом все недостаюшие вам ява библиотеки будут скачаны из репозитария. По умолчанию используется центральный Maven репозитарий, но если необходимо то можно использовать свой допустим Apache Archiva - http://archiva.apache.org, все гибко настраивается в Ivy. Давайте расмотрим все по порядку:
установку,настройку, и работу примера.
Для установки Apache Ivy вам нужно скачать с официального сайта последнию версию, распаковать архив, с копировать ivy*.jar (в моем случае ivy-2.2.0.jar) в lib директорию Apache Ant, т.е. у вас на компьютере ivy*.jar должна находиться в ANT_HOME/lib. Давайте перейдем к простому примеру который поставляется вместе с Ivy: src/example/hello-ivy, пример состоит из 3-х файлов - Hello.java простой файл при компиляции которому нужны 2 java библиотеки: commons-lang-2.0.jar и commons-cli-1.0.jar т.е. можно сказать что наше приложение зависит от 2 артифактов, которые мы каким-то образом должны получить. Все зависимости мы должны описать в файле конфигурации ivy.xml:

 
<ivy-module version="2.0"> - все настройки начинаются этим тегом и соотвественно заканчиваются, версия файла настройки 2.0
<info organisation="org.apache" module="hello-ivy"> информационный тег существенной роли не играет, нужен для формирования имени файлов
 отчета в кеше - org.apache-hello-ivy-default.xml.  
<dependencies>- начало описания наших зависимотей
        <dependency org="commons-lang" name="commons-lang" rev="2.0"> - 1-й артифакт который нам нужен 
        <dependency org="commons-cli" name="commons-cli" rev="1.0">   - и 2-й артифакт который нам нужен
 </dependencies>

Т.к. по умолчанию используется публичный репозиторий ibiblio http://repo2.maven.org/maven2 , будем разрешать зависимости используя его - найти нужную зависимость можно вручную:) Для этого, необходимо нам Maven POM Dependency(pom.xml если вы мигрируете с Maven'a) или maven-metadata.xml.Допустим мне нужна poi библиотека(артифакт) я захожу на репозитарий http://repo2.maven.org/maven2/poi/poi-2.5-final/ открываю maven-metadata.xml и переписываю зависимость:

<dependency>
    <groupId>poi</groupId>
    <artifactId>poi-2.5-final</artifactId>
    <version>20040302</version>
</dependency>

как <dependency org="groupId" name="artifactId" rev="version"/>:

<dependency org="poi" name="poi-2.5-final" rev="20040302"/>

Вот разобрались с нашими зависимостями, перейдем к файлу конфигурации ant - build.xml:

<project name="hello-ivy" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">     1-е нам нужно подключить Ivy - делается это следующим образом 
подключаем новое   пространство имен xmlns:ivy="antlib:org.apache.ivy.ant" - и все что начинается с <ivy: ... />
 будет относится к вызову команд ivy а не ant'a например: <ivy:retrieve/> - команда ivy.
    <!-- переменные нашего проекта -->
    <property name="lib.dir" value="lib" />
    <property name="build.dir" value="build" />
    <property name="src.dir" value="src" />
    
    <!-- пути где лежат наши библиотеки(артифакты) они будут   использоваться при компиляции и выполнении программы  -->
    <path id="lib.path.id">
        <fileset dir="${lib.dir}" />
	</path>
    <path id="run.path.id">
        <path refid="lib.path.id" />
        <path location="${build.dir}" />
    </path>
    
    <!-- ================================= 
          target: resolve              
         ================================= -->
    <target name="resolve" description="--> retreive dependencies with ivy">
        <ivy:retrieve/> - с начала происходит загрузка наших зависимостей в локальный репозитарий, по умолчанию в ваш домашний каталог (user home),
 в директорию .ivy2/cache. Оттуда они  загружается в нашу lib папку проекта. При следующей компиляции проекта   сначало будет просмотрен наш кеш
 на наличие загруженных артифактов(java библиотек) и соответственно с репозитария Maven'a ни чего не загрузится что приведет к боллее быстрой       
 компиляции и выполнению проекта.
    </target>    
    

    <!-- ================================= 
          target: run сдесь собирается и выполняется наш проект.
         ================================= -->
    <target name="run" depends="resolve" description="--> compile and run the project">
        <mkdir dir="${build.dir}" />
        <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="lib.path.id" />
    	<property name="msg" value="hello ivy !"/>
        <java classpathref="run.path.id" classname="example.Hello">
        	<arg value="-message"/>
        	<arg value="${msg}"/>
    	</java>
    </target>

</project>

В качестве cache у Ivy используется один единственный .ivy2/сache по умолчанию
и один единственный - публичный ibiblio resolver. Сдесь я ввел новое понятие - resolver
место от куда мы загружаем наши артифакты, мы можем организовывать цепочку (chain) из resolver'ов:
заглянем в проект chained-resolvers/settings/ivysettings.xml:

<ivysettings>
  <settings defaultResolver="chain-example"/>
  <resolvers>
    <chain name="chain-example"> - наша цепочка - объявление
      <filesystem name="libraries"> - сначало ищем артифакты в файловой системе
        <artifact pattern="${ivy.settings.dir}/repository/[artifact]-[revision].[ext]" />
      </filesystem>
      <ibiblio name="ibiblio" m2compatible="true" /> - потом обрашаемся к Maven ibiblio
    </chain>
  </resolvers>
</ivysettings>

Существуют различные resolver'ы способные загружать артифакты не только с web-серверов,
но и ssh, ftp, smb, webdav и других, полный список смотрите в документации.

Так вернемся к нашим баранам нам осталось только запустить наш проект на выполнение.
Сразу предупрежу если вы выходите в интернет через proxy-server то вам нужно настроить
соединение для Ivy установите переменную окружения:

ANT_OPTS=-Dhttp.proxyHost=myproxyhost -Dhttp.proxyPort=8080 -Dhttp.proxyUserName=myproxyusername -Dhttp.proxyPassword=myproxypassword -Dhttps.proxyHost=myproxyhost -Dhttps.proxyPort=8080

Запустите Ant - сначало загрузятся наши артефакты, проект скомпилируется и запустится.
Кратко о главном - как использовать Ivy с Ant для этого нам надо:
1 Описать артефакты, необходимые для сборки проекта (файл ivy.xml)
2 Описать репозитории - цепочки (chain), из которых эти артефакты можно получить (файл ivysettings.xml)
3 Описать в Ant - build.xml вызов задач Ivy.

Dmitriy

Орфография ужос))) А за статью спасибо

просто хотел компактнее

просто хотел компактнее изложить мысль - на орфографию не обратил внимание :) пожалуйста :)

Отправить комментарий

КАПЧА
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Enter the characters shown in the image.