mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
« Наводим порядок в разработке ПО вместе с maven. Часть 2 | Наводим порядок в разработке ПО вместе с maven. Часть 4 » |
Наводим порядок в разработке ПО вместе с maven. Часть 3
Я продолжаю рассказ об maven – инструменте, с помощью которого мы можем организовать унифицированное, не зависящее от конкретной среды разработки (IDE) представление проекта java. В прошлых двух статьях я пробежался по основным “вкусностям” maven: управление зависимостями проекта, способности maven загружать из internet и сохранять в локальном репозитории артефакты. Также я рассказал о жизненном цикле maven, о том из каких фаз он состоит, и как мы можем сами инициировать определенные этапы из “жизни” проекта. Все это было, и было, скажем честно, очень поверхностно: некоторые из аспектов, например, упаковка проекта были практически не затронуты, и сегодня пришло время это исправить. Я снова попытаюсь создать проект maven “с нуля” и пройтись по всем его шагам, вот только сделаю это более основательно и подробно.Создание проекта начинается с создания заготовки: структуры каталогов и файла pom, в котором мы описываем нужные для проекта библиотеки-зависимости. В общем случае, количество подобных библиотек довольно велико. И если вы, к примеру, хотите создать большой проект, в котором есть и веб-интерфейс в виде war-модулей, и логика приложений в виде jar и ejb-модулей, то вам нужно настроить большое количество зависимостей. Нужно настроить плагины, обрабатывающие специфические для модуля ресурсы. Например, для web-модуля, нужно грамотно настроить список библиотек, которые будут помещены в папку WEB-INF/lib, для ear-модулей, нужно настроить генерацию специальных файлов-дескрипторов, специфических для конкретных серверов приложений. Я могу сколь угодно долго перечислять подобные “очень специальные” задачи, но суть одна: количество действий по настройке проекта даже с помощью maven все равно очень велико и поэтому появились шаблоны проектов или их заготовки. Эти заготовки проектов называются archetypes. Управление архетипами автоматизировано плагином “Maven Archetype Plugin”. К примеру, для создания нового проекта я выполняю команду “m2 archetype:generate”. После этого на экране появится огромный список перечисления проектов-заготовок, на основании которых я могу создать и свой проект. К примеру, там есть заготовки проектов, построенных на использовании технологий “Hibernate, Spring and JSF”, еще есть “Hibernate, Spring and Spring MVC”, “Hibernate, Spring and Struts 2”, “Hibernate, Spring and Tapestry 4”, “Hibernate and Spring and XFire” и еще множество других наборов технологий. Так в моем случае список доступных вариантов составил 44 позиции. Тут я сделаю небольшое отступление и могу посоветовать, в особенности начинающему java-программисту, обратить свое внимание на проект AppFuse (http://appfuse.org/). Назначение этого проекта – собрать в единое место сведения (документацию) и ресурсы (те же “комплекты” библиотек) нужные для быстрого старта нового проекта построенного на базе “стека” технологий. Т.е. цепочки инструментов, начиная от слоя хранения данных, до слоя их визуализации. Конечно, у меня с вами список доступных шаблонов проектов может отличаться, но все же обращу внимание на столь занимательный факт как “confluence-plugin-archetype (Atlassian Confluence plugin archetype)”. Этот плагин (шаблон проекта) нас интересует не сам по себе, а больше как проявление интересной тенденции. Для тех, кто ни разу не слышал об “confluence”, то кратко расскажу, что это продукт компании Atlassian, которая “съела целую стаю собак” на разработке различных инструментов помогающих управлять проектами. Во-первых, ведение списка задач проекта и багов в jira (я про jira писал серию статей еще год назад). Затем идет confluence – популярная система представления документации и базы знаний по проекту (ближайший аналог такого инструмента как mediawiki), с множеством “заточек” именно под разработку проектов программного обеспечения. Еще Atlassian создает fisheye (инструмент наблюдения за состоянием проекта в cvs-репозитории), crucible (инструмента аудита кода и оценки его качества), bamboo (continuous integration server, подобрать адекватный и короткий русский перевод этого термина мне очень тяжело). В предыдущем абзаце помимо краткого упоминания об инструментах, о которых мне очень хотелось бы когда-нибудь вам рассказать, главное другое: то, что многие компании и индивидуальные разработчики ПО, предлагают свои заготовки проектов maven. Т.е. посещая сайт условной компании “X” вы можете на странице “загрузить библиотеку” найти не только ссылки на архивы с библиотеками, а одну единственную строку “m2 archetype:generate” (конечно, более длинную с указанием дополнительных опций-настроек проекта). И вы можете у себя на компьютере выполнить команду “m2 archetype:generate”. К примеру, для упомянутого чуть ранее appfuse, я нашел на их сайте следующую строку:
Возвратимся назад к генерации проекта. Выполнив команду “m2 archetype:generate” мы попали на первый “экран” мастера создания нового проекта, там мы выберем в списке вариантов “maven-archetype-quickstart” (я решил пока создать простенький java-проект, не веб и не ejb). Идя по шагам мастера, мы указываем такие параметры будущего проекта как название проекта-артефакта, затем название группы артефактов, к которой он относится, затем идет номер проекта. Если вы посмотрите внимательно еще раз на приведенную выше строку пример вызова команды “mvn archetype:create”, то увидите, что те же параметры проекта указаны как значения переменных через “-D”. Завершающим шагом создания проекта будет окошко подтверждения, где мы должны согласиться с тем, что все указанные на предыдущих шагах сведения верны и проект будет полностью создан и готов к дальнейшей разработке.
Теперь рассмотрим подробнее такой аспект проекта как репозитории артефактов. Нужные для работы проекта зависимости-библиотеки-артефакты должны быть автоматически загружаться на ваш компьютер, в папку “.m2/repository” из internet. “Из коробки” maven знает о существовании репозитория размещенного по адресу http://repo1.maven.org/maven2. В практике этого не достаточно, т.к. часть артефактов либо мало известна и еще “не заслужила” права быть размещенной в этом репозитории, либо проект распространяется по лицензии запрещающей размещение двоичных файлов (jar-библиотек) в каких-либо public репозиториях. Либо существует запаздывание копирования новых версий артефактов-проектов из репозитория поддерживаемого непосредственно разработчиком библиотеки в public-репозиторий. Одним словом, причин много, а нам стоит научиться настраивать список используемых в проекте public-репозиторий. Для этого в pom-файле проекта нужно создать секцию repositories, внутри которой мы задаем список репозиториев, из которых maven будет загружать зависимости. Каждый репозиторий представляется набором характеристик, основные из которых это название репозитория (name) и адрес репозиторий (url).
<repositories>
<repository>
<id>main.1</id>
<name>official maven repository</name>
<url>http://repo1.maven.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>main.1</id>
<name>official maven repository</name>
<url>http://repo1.maven.org/maven2</url>
</pluginRepository>
</pluginRepositories>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy>
<updatePolicy>always</updatePolicy>
</snapshots>
mvn install:install-file -DgroupId=bar-group -DartifactId=commons-bar -Dversion=1.0 -Dpackaging=jar -Dfile=file-bar-commons.jar
<settings>
<proxies>
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net,some.host.com</nonProxyHosts>
</proxy>
</proxies>
</settings>
-Dorg.apache.maven.user-settings=/path/to/user/settings.xml
Одна из самых вкусных вещей, которая только есть в maven – это управление транзитивными зависимостями. К примеру, вы решили разработать проект с помощью spring, но сама библиотека spring не самодостаточна: ей потребуются библиотеки из семейства apache commons, logging и многое другое. К счастью, мы не должны сами прослеживать цепочки зависимостей и перечислять сто и одну позицию библиотек (избегая конфликта версий) внутри файла проекта pom.xml. Т.к. каждый файл артефакта (jar) имеет компаньона в виде файла pom, в котором перечисляются сведения об артефакте и, в частности, от каких других библиотек артефакт зависит. Maven сам построит дерево зависимостей и загрузит нужные для проекта артефакты в локальный репозиторий, а затем “подсунет” их проекту при компиляции или упаковке. Начнем мы с того, что еще раз рассмотрим области действия артефактов. Когда к проекту подключается артефакт, то мы указываем не только его имя, версию и родительскую группу артефактов, но еще две величины: область действия и классификатор. Классификатор – относительно простая и редко используемая вещь, нужная в тех случаях, когда деление артефакта по версиям является не достаточным. К примеру, вы разработали библиотеку математических функций, под номером 1.0, но есть два подвида этой библиотеки: одна из которых использует быстрый но не точный алгоритм расчета, да хоть какого-нибудь хитроумного интеграла, а вторая версия библиотеки – медленный но точный. Или библиотеки содержат вставки кода специфические для различных операционных систем: для windows и linux. Давать этим библиотекам различные номера – идеологически не верно, а вот дать разные классификаторы, самое то (классификатор добавляется к концу имени файла артефакта после его номера):
<dependency>
<groupId>mygroup</groupId>
<artifactId>myartifact</artifactId>
<version>1.0</version>
<classifier>linux</classifier>
</dependency>
« Наводим порядок в разработке ПО вместе с maven. Часть 2 | Наводим порядок в разработке ПО вместе с maven. Часть 4 » |