Статьи

Maven Deploy to Nexus

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>
      <nexusUrl>http://localhost:8081/nexus/</nexusUrl>
      <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 ; функциональность постановки отключена и т. д. — именно эти решения делают решение простым и практичным. Потенциальная активация полной функциональности постановки может быть темой будущей статьи. Наконец, мы обсудим процесс выпуска в следующей статье.

Ссылка: Maven Deploy to Nexus от нашего партнера JCG Юджина Параскива в блоге baeldung .