10.10.2012

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

Комментариев нет:

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