Ant+Ivy: закроем тему управления зависимостями при сборке проектов

За полгода в фоновом режиме перевел сборку подконтрольных проектов на Ant+Ivy. До этого использовался Maven 1, который функционально устраивал, но требовал создания правильного окружения — Maven правильной версии, правильный набор плагинов правильных версий, иногда правильно пропатченных. В результате доходило до абсурда — один из проектов собирался только на одной машине, попытки воссоздать окружение на другой ни к чему не привели.

Все это подтолкнуло к упрощению процесса сборки — переходу обратно на Apache Ant. При этом требования к окружению свелись к минимуму — должен быть установлен Sun JDK, Ant правильной версии (1.7) и «большие» библиотеки (типа Eclipse).

Конечно, Ant требует описания процесса сборки для каждого проекта, а в Maven для проектов стандартной структуры стандартная сборка уже описана. Ну что ж, пришлось оформить описание сборки виде библиотеки. Теперь на новый простой проект трачу не больше времени, чем при использовании Maven. Библиотека опубликована под именем Buildbase, уже достаточно функциональна и стабильна, но как самостоятельный проект не рекламируется.

Второе преимущество Maven — управление зависимостями: описание зависимостей, скачивание недостающих артефактов из репозитория и т.п. Сначала я нашел простенькую библиотеку и временно перевел все на нее. Затем разобрался с Ivy и понял, что реализация управления зависимостями в этом инструменте сделана гораздо грамотнее, чем в Maven. Написать про Ivy обещал уже давно, мешала одна непонятность — не мог понять, как использовать локальный кэш зависимостей. Месяц назад разобрался и с этим, читайте Getting Started with Ant+Ivy.

Ivy — это официальный подпроект Apache Ant. Надеюсь, скоро он переедет из Инкубатора на свое законное место — в середине декабря вышла beta1, я же без проблем пользуюсь alpha2.

Подключить Ivy к Ant очень просто, для этого надо:

  1. Описать внешние артефакты, необходимые для сборки проекта.
  2. Описать репозитории, из которых эти артефакты можно получить.
  3. Вставить в build.xml вызов задач Ivy, которые обеспечат получение этих артефактов.

Делай раз, файл ivy.xml, который находится в корне проекта (там же, где build.xml):


    
    
        
        
        
        
        
    
    
        
        
        
    
    
        

        

        

        
    
    
        
    

В начале перечислены конфигурации проекта — собирается ли source distribution (src), jar или полный дистрибутив (all), который включает в себя и то, и другое.
build — это конфигурация, которая определяет зависимости, необходимые только при сборке. runtime — зависимости, которые потребуются для запуска.
То есть, конфигурации используются для разных целей — и для входа, и для выхода. Врать не буду, сильно я в этом не разбирался. Можно, наверное, и еще сократить эту секцию. Впрочем, работает и ладно.

dependency — это, собственно, зависимость. Имя, версия — тут, вроде, все понятно. По этим атрибутам строится имя артефакта. Если оно другое, внутри dependency можно указать artefact, изучайте документацию.

Делай два, файл ivyconf.xml, который также находится в корне проекта (там же, где build.xml):


    
        
        
            
                
                
                    
                
                
            
        
   

Тут определены репозитории, в которых Ivy будет искать зависимости (вернее, резолверы, которые умеют искать в этих репозиториях. Но уж больно слово неуклюжее, а смысл и так ясен). Начнем с конца.

  • ibiblio — это стандартный Maven репозиторий на ibiblio. Если используется только он, ivyconf.xml, вроде, вообще не нужен.
  • url — это удаленный репозиторий, для которого задан шаблон поиска артефактов. Параметрами шаблона являются атрибуты из ivy.xml.
  • cache — это самый нужный репозиторий, который почему-то толком не описан — локальный кэш, куда Ivy скачивает зависимости перед тем, как скопировать их в заданную папку проекта.
  • chain — объединяет вышеперечисленные репозитории в список. Если returnFirst=»false», то поиск будет производиться по всем перечисленным репозиториям, даже если артефакт уже найден. Поэтому рекомендую ставить returnFirst=»true», разрешение зависимостей будет выполняться быстрее.

Делай три, в build.xml добавляем инициализацию Ivy и скачивание зависимостей:

  
    
      
    
    
    
  

  
    
    
    
    
  

Первая цель определяет задачи, определенные в пространсте имен «ivy». Вторая — скачивание зависимостей:

  • ivy:settings — считывание настроек Ivy.
  • ivy:resolve — поиск зависимостей в репозиториях.
  • ivy:retrieve — собственно, скачивание зависимостей для заданной конфигурации. Атрибут pattern задает место назначения для скачанных артефактов. Значения этих атрибутов могут быть примерно такими:
    ivy.retrieve.runtime.pattern = ${libs.dir}/[artifact].[ext]
    ivy.retrieve.build.pattern   = ${tools.dir}/[artifact].[ext]
    

Вот, собственно, и все минимальные дополнительные расходы для автоматического скачивания зависимостей. Можно ещё добавить в build.xml автоматическое скачивание самого Ivy, тогда предустанавливать придется только Ant:

  
    
    
    
    

    

    
      
        
          
        
        
      
    

  

  
    
    
    
    
  

Резюме:

  • Ivy имеет богатую функциональность и очень гибко настраивается — можно приспособить под любые нужды.
  • Ivy — подпроект Apache Ant, что гарантирует развитие и поддержку.
  • Документация по Ivy в настоящий момент несколько неполна и неактуальна. Есть надежда, что к выходу из Инкубатора ситуация улучшится.

01.01.2008  Метки: ,   Рубрики: Инструменты, Разработка

Написать комментарий