1. Обзор
В предыдущей статье я обсуждал, как проект Maven может локально установить сторонний jar, который еще не был развернут в центральном Maven (или в любом из других больших и общедоступных репозиториев). Это решение следует применять только в небольших проектах, где установка, запуск и обслуживание полноценного сервера Nexus могут быть излишними. Однако по мере развития проекта Nexus быстро становится единственным реальным и зрелым вариантом для размещения сторонних артефактов, а также для повторного использования внутренних артефактов в потоках разработки. Эта статья покажет, как развернуть артефакты проекта в Nexus с помощью Maven .
2. Требования Nexus в пом
  Чтобы Maven мог развернуть артефакты, которые он создает на этапе сборки пакета , ему необходимо определить информацию хранилища, в которой будут развернуты упакованные артефакты, с помощью элемента distributionManagement : 
 
| 1 2 3 4 5 6 | <distributionManagement>   <snapshotRepository>      <id>nexus-snapshots</id>   </snapshotRepository></distributionManagement> | 
Размещенный общедоступный репозиторий Snapshots поставляется из коробки на Nexus, поэтому нет необходимости создавать или настраивать что-либо еще. Nexus позволяет легко определять URL-адреса своих размещенных репозиториев — каждый репозиторий отображает точную запись, которая должна быть добавлена в <distributionManagement> проекта, на вкладке Сводка .
3. Плагины
По умолчанию Maven обрабатывает механизм развертывания через подключаемый модуль maven-deploy-plugin — это сопоставлено с фазой развертывания жизненного цикла Maven по умолчанию:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 | <plugin>   <artifactId>maven-deploy-plugin</artifactId>   <version>2.7</version>   <executions>      <execution>         <id>default-deploy</id>         <phase>deploy</phase>         <goals>            <goal>deploy</goal>         </goals>      </execution>   </executions></plugin> | 
Плагин maven-deploy-plugin является жизнеспособным вариантом для решения задачи развертывания артефактов проекта в Nexus, но он не был создан, чтобы в полной мере воспользоваться тем, что может предложить Nexus. В связи с этим Sonatype создал специальный плагин для Nexus — nexus-staging-maven-plugin — который на самом деле предназначен для того, чтобы в полной мере воспользоваться более продвинутыми функциональными возможностями, которые может предложить Nexus — такими функциями, как постановка.
Хотя для простого процесса развертывания нам не требуется промежуточная функциональность, мы продолжим работу с этим нестандартным плагином Nexus, поскольку он был создан с явной целью хорошо общаться с Nexus. Единственная причина использовать maven-deploy-plugin — оставить возможность использовать альтернативу Nexus в будущем — например, хранилище Artifactory . Однако, в отличие от других компонентов, которые могут фактически меняться в течение жизненного цикла проекта, менеджер хранилища Maven вряд ли изменится, поэтому гибкость не требуется. Итак, первый шаг в использовании другого плагина развертывания на этапе развертывания — отключение существующего сопоставления по умолчанию:
| 1 2 3 4 5 6 7 8 | <plugin>   <groupId>org.apache.maven.plugins</groupId>   <artifactId>maven-deploy-plugin</artifactId>   <version>${maven-deploy-plugin.version}</version>   <configuration>      <skip>true</skip>   </configuration></plugin> | 
Теперь мы можем определить:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | <plugin>   <groupId>org.sonatype.plugins</groupId>   <artifactId>nexus-staging-maven-plugin</artifactId>   <version>1.3</version>   <executions>      <execution>         <id>default-deploy</id>         <phase>deploy</phase>         <goals>            <goal>deploy</goal>         </goals>      </execution>   </executions>   <configuration>      <serverId>nexus</serverId>      <skipStaging>true</skipStaging>   </configuration></plugin> | 
Цель развертывания плагина сопоставлена с фазой развертывания сборки Maven. Также обратите внимание, что, как уже говорилось, нам не нужна промежуточная функциональность при простом развертывании артефактов -SNAPSHOT в Nexus, так что он полностью отключается с помощью элемента <skipStaging> .
4. Глобальные настройки.xml
Развертывание на Nexus является защищенной операцией, и пользователь развертывания для этой цели существует из коробки на любом экземпляре Nexus. Настройка Maven с учетными данными этого пользователя развертывания , чтобы он мог правильно взаимодействовать с Nexus, не может быть выполнена в pom.xml проекта. Это связано с тем, что синтаксис pom этого не позволяет, не говоря уже о том, что pom может быть публичным артефактом, поэтому не очень хорошо подходит для хранения учетных данных.
Учетные данные сервера должны быть определены в глобальном Maven setting.xml :
| 1 2 3 4 5 6 7 | <servers>   <server>      <id>nexus-snapshots</id>      <username>deployment</username>      <password>the_pass_for_the_deployment_user</password>   </server></servers> | 
Сервер также может быть настроен на использование безопасности на основе ключей вместо необработанных и незашифрованных учетных данных.
5. Процесс развертывания
Выполнение процесса развертывания является простой задачей:
| 1 | mvn clean deploy -Dmaven.test.skip=true | 
Пропуск тестов — это нормально в контексте задания на развертывание, потому что это задание должно быть последним заданием в трубопроводе развертывания для проекта. Типичным примером такого конвейера развертывания может быть последовательность заданий Jenkins, каждое из которых запускает следующее, только если оно успешно завершается. Таким образом, предыдущие задачи в конвейере несут ответственность за запуск всех наборов тестов из проекта — к моменту запуска задания развертывания все тесты уже должны пройти.
Если запускается одна команда, то тесты могут оставаться активными для запуска до выполнения этапа развертывания :
| 1 | mvn clean deploy | 
6. Заключение
Это простое, но очень эффективное решение для развертывания артефактов Maven на Nexus. Это также несколько противоречит — nexus-staging-maven-plugin используется вместо стандартного maven-deploy-plugin ; функциональность постановки отключена и т. д. — именно эти решения делают решение простым и практичным. Потенциальная активация полной функциональности постановки может быть темой будущей статьи. Наконец, мы обсудим процесс выпуска в следующей статье.