Статьи

Развертывание в Maven Central Repository

Вам нужно сделать вашу библиотеку Java общедоступной? Ваш проект размещен на GitHub? Вам нравится идея «развернуть все в одном в центральном репозитории Maven»? Я собираюсь показать, как настроить это с использованием maven-release-plugin . Исходный код размещен на GitHub, поэтому будет также описан SSH-доступ к управлению исходным кодом.

Существуют различные шаги, необходимые для настройки среды для вашего проекта. Я следовал многим шагам из официального руководства SonaType , поэтому буду ссылаться на него при необходимости. Но в этом руководстве также описывается множество методов, которые не нужны для настройки кнопки «развертывание в центральном репозитории Maven».

рассмотрение

Мой первый подход заключался в создании задания Jenkins, которое представляло бы кнопку «Развернуть в Maven Central». Эта идея намного чище для меня, чем толкание от моей машины для разработки. Я с трудом пробовал, но не смог заставить плагин Jenkins SSH Agent зарегистрировать мою SSH-идентичность, когда maven-release-plugin подталкивает обновление версии к GitHub. Поэтому очень простой скрипт Linux Bash состоит из двух этапов.

1. Создайте билет SonaType JIRA для регистрации вашей группы.

SonaType управляет одним из крупнейших репозиториев Nexus. Необходимо развернуть там артефакт Java, прежде чем его можно будет синхронизировать с репозиторием Maven Central. Чтобы выпустить библиотеку Java в репозиторий SonaType Nexus, необходим билет JIRA. Руководство SonaType включает в себя подробное описание, как его создать.

Возьмите Maven groupId, отражающий ваш домен верхнего уровня. Обычно он совпадает с основным пакетом Java (например, com.google , а не com.google.guava ). Это потому, что вы не хотите создавать билет JIRA для каждого проекта / библиотеки в вашем домене / главном пакете / groupId.  Вот больше чтения о соглашении об именовании пакетов Java.

2. Унаследуйте артефакт Maven от SonaType OSS pom.xml

SonaType родительский POM содержит

  • URL к хранилищу SonaType Nexus
  • Конфигурация плагинов Maven

    • Плагин Enforcer
    • Релиз плагин — это самый важный
    • Исходный плагин — генерирует JAR с источниками
    • Плагин JavaDoc — генерирует JAR с комментариями JavaDoc
    • Плагин GPG — подписывает артефакт с помощью инструмента GnuPG (это требуется Центральным репозиторием Maven)
<parent>
	<groupId>org.sonatype.oss</groupId>
	<artifactId>oss-parent</artifactId>
	<version>9</version>
</parent>

Наличие этого родительского POM удобно, потому что в противном случае вам нужно будет указать все плагины в вашем POM. Единственная проблема заключается в том, что версии плагинов немного устарели, поэтому я решил переопределить некоторые версии в моем POM следующим образом:

<pluginManagement>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-gpg-plugin</artifactId>
			<version>1.5</version>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-release-plugin</artifactId>
			<version>2.4.2</version>
		</plugin>
	</plugins>
</pluginManagement>

Важное обновление версии здесь — это плагин GPG, потому что обновленная версия имеет полезные функции, описанные в разделе о подписи GPG .

3. Настройте подпись GPG для артефакта Maven

Это необходимо из-за политики безопасности центрального хранилища Maven. Включите различные подэтапы:

<profiles>
  <profile>
    <id>sonatype-oss-release</id>
    <properties>
      <gpg.keyname>F21879F3</gpg.keyname>
      <gpg.passphrase>*********</gpg.passphrase>
      <gpg.defaultKeyring>false</gpg.defaultKeyring>
      <gpg.useagent>true</gpg.useagent>
      <gpg.lockMode>never</gpg.lockMode>
      <gpg.homedir>/home/lkrnac/.gnupg</gpg.homedir>
      <gpg.publicKeyring>/home/lkrnac/.gnupg/pubring.gpg</gpg.publicKeyring>
      <gpg.secretKeyring>/home/lkrnac/.gnupg/secring.gpg</gpg.secretKeyring>
    </properties>
  </profile>
</profiles>

F21879F3 — это мой открытый идентификатор ключа GPG. Команда gpg —list-keys выдаст вам список. Passphase — это пароль для вашего личного ключа GPG. Папка .gnupg обычно создается в вашем домашнем каталоге.

4. Настройте свои учетные данные для хранилища SonaType Nexus

Необходим для отправки в репозиторий SonaType Nexus. То же, что и учетные данные SonaType JIRA. Снова в settings.xml :

<servers>
  <server>
    <id>sonatype-nexus-snapshots</id>
    <username>lkrnac</username>
    <password>*************</password>
  </server>
  <server>
    <id>sonatype-nexus-staging</id>
    <username>lkrnac</username>
    <password>*************</password>
  </server>
</servers>

5. Заполните pom.xml обязательные разделы

6. Настройте SSH доступ к GitHub

Выполните следующие подэтапы:

7. Создать кнопку «Развернуть в Maven Central»

Maven-release-plugin должен отправить / зарегистрировать обновление версии в систему контроля версий и пометить ревизию. В моем случае код размещен на GitHub. Поэтому мне нужно зарегистрировать мою личность SSH (созданную на предыдущем шаге) перед вызовом целей maven-release-plugin. Это делается с помощью bash-скрипта maven-central-deploy.sh, расположенного рядом с pom.xml :

!/bin/bash
# Deploy maven artefact in current directory into Maven central repository 
# using maven-release-plugin goals

read -p "Really deploy to maven cetral repository  (yes/no)? "

if ( [ "$REPLY" == "yes" ] ) then
  ssh-add ~/.ssh/lubos.krnac
  ssh-add -l
  mvn release:clean release:prepare release:perform -B -e | tee maven-central-deploy.log
  ssh-add -D
else
  echo 'Exit without deploy'
fi

Сделайте скрипт исполняемым

chmod +x maven-central-deploy.sh

 8. Нажмите кнопку «Развернуть в Maven Central»

Просто беги

./maven-central-deploy.sh

подтвердите и введите парольную фазу закрытого ключа SSH, если требуется.

9. Выпуск артефакта через репозиторий SonaType Nexus

Когда артефакт передается в хранилище SonaType Nexus. Вы должны выпустить это . Наконец, вам нужно добавить комментарий к проблеме SonaType JIRA, которую вы создали в начале, и подождать, пока кто-нибудь не просмотрит ваш артефакт и не настроит синхронизацию с Maven Central. Конечно, часть JIRA должна быть сделана только один раз.

Ссылка на сайт

Пример проекта, настроенного таким образом, размещен на GitHub . (Это крошечная библиотека тестирования).