Публикация Java приложения в личный Nexus

Рассказываю, как опубликовать свой артефакт в корпоративный или личный Nexus Sonatype

· 3 мин.

Nexus это хранилище артефактов. Артефакт это ваше приложение, например jar-ник. Чаще всего в Nexus сохраняют библиотеки, чтобы другие разработчики могли их подключить в виде зависимости к своему приложению.

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

Публикация JAVA библиотеки в Maven Central
Публикация артефакта библиотеки в Maven Central через Sonatype OSSHR.

Nexus Sonatype позволит вам создать свой приватный, ну либо публичный Nexus с авторизацией. Также его можно использовать, как прокси перед Maven Central.

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

Настраиваем settings.xml

Скорее всего у вас есть логин и пароль аккаунта в Nexus. Эти данные нужно указать в файле .m2/settings.xml. Если этого файла нет в папке .m2 создайте его.

<settings>
  <servers>
    <server>
      <id>nexus-server</id>
      <username>nexus-login</username>
      <password>nexus-password</password>
    </server>
  </servers>
</settings>

Настраиваем приложение

Теперь переходим к pom.xml приложения.

В секцию properties добавляем версии плагинов и URL нексуса.

<properties>
  ...
    <nexus.url>http://ip_you_nexus:nexus_port</nexus.url>
    <plugin.maven.deploy.version>2.8.2</plugin.maven.deploy.version>
    <plugin.nexus.stading.maven.version>1.6.8</plugin.nexus.stading.maven.version>
  ...
</properties>

Добавляем в pom.xml url на репозитории в нексусе: снепшотный и релизный.

<distributionManagement>
    <repository>
        <id>nexus-server</id>
        <url>${nexus.url}/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-server</id>
        <url>${nexus.url}/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

Обратите внимание на строки 3 и 7, id репозиториев должен совпадать с id в секции server файла .m2/settings.xml.

Мы заменим maven-deploy-plugin на nexus-staging-maven-plugin. После этого мы сможем деплоить в наш нексус командой mvn deploy.

<build>
  <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>${plugin.maven.deploy.version}</version>
          <configuration>
              <skip>true</skip>
          </configuration>
      </plugin>
      <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <version>${plugin.nexus.stading.maven.version}</version>
          <executions>
              <execution>
                  <id>default-deploy</id>
                  <phase>deploy</phase>
                  <goals>
                      <goal>deploy</goal>
                  </goals>
              </execution>
          </executions>
          <configuration>
              <serverId>maven-snapshots</serverId>
              <nexusUrl>${nexus.url}/nexus/</nexusUrl>
              <skipStaging>true</skipStaging>
          </configuration>
      </plugin>
  </plugins>
</build>

Если вам нужно также сохранять исходники и JavaDoc, то добавьте эти плагины:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <version>2.9.1</version>
  <configuration>
      <javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
  </configuration>
  <executions>
      <execution>
          <id>attach-javadocs</id>
          <goals>
              <goal>jar</goal>
          </goals>
      </execution>
  </executions>
</plugin>

Вот и все, теперь вы можете задеплоить артефакт в нексус обычной Maven командой:

mvn clean deploy

Вы можете настроить автоматическую сборку и доставку в Nexus с помощью Gitlab CI, подробнее об этом я писал в статье: Настройка Gitlab CI/CD для Java приложения.