Статьи

Пять советов по успешному развертыванию Maven

Maven — это одна из тех вещей, которые люди, похоже, ненавидят довольно сильно, но тем не менее, в сообществе Java неуклонно растет популярность. Я работал с Maven почти ежедневно, начиная с бета-версии 1.0, и вот пять вещей, которые, я думаю, могут помочь вашей команде более эффективно работать с Maven.

Используйте менеджер хранилища

Диспетчер хранилища — это, по сути, кеш хранилища зеркального отображения по требованию, который вы настраиваете в своей ИТ-инфраструктуре и используете в качестве основного хранилища для своих сборок. Они в основном работают следующим образом: если вы создаете проект, который зависит, например, от commons-lang-2.4.jar, менеджер хранилища загрузит артефакт из основного хранилища Maven в Интернете, поместит его в локальное кеш и вернет его в построить клиент, который просил об этом. Все последующие сборки, использующие один и тот же управляемый репозиторий, будут получать jar commons-lang из кэша, а не из Интернета.

Это имеет много преимуществ. Во-первых, это быстро. Все участники проекта, за исключением первого, будут загружать любую заданную зависимость со скоростью локальной сети, что особенно удобно при настройке среды сборки с нуля (новый участник проекта, подготовка чистой сборки и т. Д.). И, конечно, это экономит внешнюю полосу пропускания для других целей и снижения затрат.

Во-вторых, это безопаснее. Он позволяет вам запускать централизованные и инкрементные резервные копии на всех внешних зависимостях, которые используют ваши проекты, и вы уменьшаете свою зависимость от доступности общедоступных репозиториев.

В-третьих, это удобно. Время от времени вам понадобится библиотека, которая (пока) не доступна ни в одном общедоступном репозитории, поэтому вы должны опубликовать ее где-нибудь. Менеджер хранилища делает это действительно легко. И если вы разделяете внутренние библиотеки или интерфейсы между проектами, это очень удобно для развертывания в управляемом хранилище. Вы даже можете настроить свою непрерывную интеграционную сборку для автоматического развертывания снимков.

У меня был приятный опыт работы с Nexus , но есть и другие. Менеджер хранилища должен быть такой же естественной частью вашей инфраструктуры, как SCM и CI, если вы используете Maven.

Укажите версии плагинов.
По умолчанию Maven автоматически загружает новую версию любого данного плагина, когда она есть. Учитывая, что Maven на 99% состоит из плагинов (есть даже плагин плагинов !), Это потенциальная точка поломки с течением времени и, на мой взгляд, ошибка проектирования.

Начиная с версии 2.0.9, поведение по умолчанию улучшено за счет блокировки версий основных плагинов (где «ядро» определяется этим списком ). Однако вам все равно нужно явно определить версии для всех неосновных плагинов, и это можно сделать на верхнем уровне pom.xml в иерархическом проекте с помощью раздела pluginManagement.

<pluginManagement>
<plugins>
<plugin>
<artifactid>maven-assembly-plugin</artifactid>
<version>2.2-beta-2</version>
</plugin>
<plugin>
<artifactid>maven-antrun-plugin</artifactid>
<version>1.2</version>
</plugin>
</plugins>
</pluginManagement>

Сделайте это для плагинов, которые вы на самом деле используете. Обратите внимание, что для плагинов с идентификатором группы org.apache.maven.plugin, вы можете опустить элемент groupId.

Это сделает ваши сборки более стабильными и устранит довольно редкий, но очень раздражающий и запутанный набор проблем.

Узнайте, как использовать плагин зависимостей

Maven представил концепцию транзитивных зависимостей сообществу Java и с тех пор является источником путаницы.
Плагин зависимости является бесценным инструментом для анализа результатов алгоритма зависимостей, а также для обработки зависимостей различных способов. Вот несколько вещей, которые вы можете сделать с ним:

  • dependency:tree

    показывает (как вы уже догадались) дерево зависимостей для проекта, какие зависимости извлекаются и почему. Это хороший обзор, который может помочь вам настроить структуру зависимостей, исключив артефакты или переопределенные версии и так далее. Пример вывода:

    [INFO] +- org.apache.activemq:activemq-core:jar:5.2.0:compile
    [INFO] | +- org.apache.camel:camel-core:jar:1.5.0:compile
    [INFO] | +- org.apache.geronimo.specs:geronimo-jms_1.1_spec:jar:1.1.1:compile
    [INFO] | +- org.apache.activemq:activeio-core:jar:3.1.0:compile
    [INFO] | | \- backport-util-concurrent:backport-util-concurrent:jar:2.1:compile
    [INFO] | \- org.apache.geronimo.specs:geronimo-j2ee-management_1.0_spec:jar:1.0:compile
  • dependency:go-offline

    Загружает все зависимости проекта и плагины, транзитивно. Это хорошая команда для запуска как, если вы хотите работать в автономном режиме некоторое время, и если вы хотите получить как можно больше внешних зависимостей за один раз без какого-либо ручного вмешательства, пока вы идете, берите чашку кофе и / или читаете еще один пункт в эффективной Java 😉

  • dependency:copy
    dependency:copy-dependencies

    Если вам когда-либо понадобится обрабатывать артефакты в виде файлов, копируя все или некоторые из них в произвольное место по какой-либо причине, это хороший подход.

Есть еще много вещей, которые вы можете сделать с ним, и овладение им поможет вам справиться с ситуацией переходной зависимости.

Используйте документацию

Ну, да. Но слабым местом Maven в глазах многих людей является отсутствие документации и иногда плохо организованной информации. Однако есть несколько хороших ориентиров, которые вы можете распространить на свою команду, настроив ссылки на вики, например:

  • Полное руководство по Maven : бесплатная книга от Sonatype, доступная как в формате HTML, так и в формате PDF. Хорошо для новичка, а иногда и в качестве справки. Если вы не знаете, с чего начать, начните здесь.
  • Список плагинов : полный список официальных плагинов со ссылками на каждую страницу проекта и подраздел JIRA. Большая часть основных функций фактически выполняется одним из этих плагинов, и вы можете многому научиться, изучая такие вещи, как документация плагинов ресурсов .
  • Ссылка POM : для чуть более продвинутых пользователей. Каждый элемент в POM объясняется. Не забудьте указать информацию XSD в вашем файле POM, чтобы получить максимальную помощь от вашего редактора XML.

Понимание соглашений

Maven — это инструмент, основанный на соглашениях, освобождающий вас от выполнения таких общих задач, как компиляция исходного кода, выполнение тестов или упаковка веб-приложения в файл war. Изучение соглашений — структура каталогов, этапы сборки — и работа по ним сделают вашу жизнь намного легче.

Однако, даже в проектах среднего размера могут быть ситуации, когда нужно настроить сборку, и Maven иногда может быть довольно громоздким, когда вам нужно нарушить соглашения. Но, понимая соглашения и имея представление о том, что есть большая вероятность, что то, что вы пытаетесь сделать, может быть достигнуто в рамках соглашений, вы сможете найти другой подход, чем вы могли бы иметь в противном случае.

Может быть, тот уродливый jar-split, file- copying , token-заменяющий
хакер antrun, который вы потратили на мучительную неделю, можно было заменить, извлекая часть проекта в отдельный модуль и вместо этого включая в качестве зависимости? Намного легче плыть вниз по течению, чем вверх по течению.

Maven не идеален ни в коем случае, но он принес стандартизацию и соглашения в мир разработки Java. Структура проекта, структура каталогов, общедоступные метаданные и публикации репозитория артефактов — вот лишь некоторые из них. Доступно множество плагинов, как центральных, так и сторонних, и большинство IDE и серверов непрерывной интеграции очень хорошо поддерживают Maven.

Большая часть стандартизации может даже пережить сам инструмент Maven, как продемонстрировали две более новые системы сборки для Java:
Buildrи
Gradle . Они оба используют многие из одних и тех же соглашений, и могут бросить вызов Maven, возможно, им будет проще уменьшать сложность и иметь более низкий порог для новичков. Прогресс в Maven немного замедлился после 2.0, но недавно
была выпущена версия 2.1.0 с рядом важных улучшений, например, параллельное разрешение зависимостей.