Публикация JAVA библиотеки в Maven Central

Backend Java Developer
Backend Java Developer

Вы написали библиотеку на Java и теперь хотите сделать ее общедоступной. Самый простой способ распространения библиотек – это загрузить ее в Maven Central.

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

Помимо Maven Central есть и другие Nexus хранилища – Open Source Software Repository Hosting Service (OSSRH). Крупнейшим является Sonatype OSSRH.

Sonatype OSSRH синхронизируется с Maven Central. Поэтому в этой статье мы разберемся, как зарегистрироваться в Sonatype OSSRH и настроить Maven pom для деплоя в Sonatype OSSRH.

Мем про загрузку в Maven Central

Зависимость в maven централ выглядит следующим образом.

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.1.1</version>
</dependency>

groupId и artifactId составляют идентификатор вашей библиотеки. groupId - это идентификатор группы проекта. Как правило, он уникален среди организаций и представляет собой доменное имя наоборот. artifactId - это идентификатор проекта в группе проектов.

Чтобы иметь возможность загружать библиотеки, необходимо купить доменное имя, которое будет вашим groupId.

И так мы купили домен, теперь необходимо подать заявку на регистрацию groupId и подтвердить свои права на домен. Делается это через issues в Jira Sonatype.

Поддомены
Поддомены отдельно регистрировать не надо. После регистрации основного домена, вы сможете использовать и его поддомены.
Заявка на подтверждение groupId
  • Тема: Publish rights for domain.name

  • Описание: I would like to publish my name.domain artifacts. The rights to the domain belong to me.

  • Group Id: ru.upagge

  • Project URL: Ссылка на ваш проект в GitLab или GitHub

  • SCM url: Тоже ссылка на ваш проект, но добавьте в конце .git

  • Already Synced to Central: No

Через какое-то время в ваше issue пришлют инструкцию, как подтвердить владение доменом. Мне прислали через минуту, скорее всего это автоматическое сообщение.

Как подтвердить свои права на Group Id

Пойдем самым быстрым путем - добавим TXT запись для домена. Сделать это можно у регистратора домена.

  • Тип записи: TXT
  • Subdomain: @
  • Text: Ссылка на тикет в Jira

После этого ждем пока DNS записи обновятся. У каждого регистратора это занимает разное время. У REG.RU записи обновились за 15 минут.

После того, как вы убедились, что запись появилась, возвращаемся в тикет. Оставляем там короткий комментарий: done.

Буквально через 10 минут приходит оповещение, что все успешно.

Успешно подтверждаем права на ru.upagge

Перед настройкой .pom необходимо создать PGP ключ для подписи релиза.


gpg --full-gen-key

gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Выберите тип ключа:
   (1) RSA и RSA (по умолчанию)
   (2) DSA и Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор? 1
длина ключей RSA может быть от 1024 до 4096.
Какой размер ключа Вам необходим? (3072) 2048
Запрошенный размер ключа - 2048 бит
Выберите срок действия ключа.
         0 = не ограничен
      <n>  = срок действия ключа - n дней
      <n>w = срок действия ключа - n недель
      <n>m = срок действия ключа - n месяцев
      <n>y = срок действия ключа - n лет
Срок действия ключа? (0) 0
Срок действия ключа не ограничен
Все верно? (y/N) y

GnuPG должен составить идентификатор пользователя для идентификации ключа.

Ваше полное имя: Struchkov Mark
Адрес электронной почты: example@upagge.ru
Примечание:
Вы выбрали следующий идентификатор пользователя:
    "Struchkov Mark <example@upagge.ru>"

Сменить (N)Имя, (C)Примечание, (E)Адрес; (O)Принять/(Q)Выход? O
Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
gpg: ключ C7F6E84396D004C4 помечен как абсолютно доверенный
gpg: сертификат отзыва записан в '/home/upagge/.gnupg/openpgp-revocs.d/736AD6032D072F9E452911D5C7F6E84396D004C4.rev'.
открытый и секретный ключи созданы и подписаны.

pub   rsa2048 2021-04-02 [SC]
      736AD6032D072F9E452911D5C7F6E84396D004C4
uid                      Struchkov Mark <example@upagge.ru>
sub   rsa2048 2021-04-02 [E]

  • Тип ключа: RSA и RSA
  • Размер ключа: 2048
  • Срок действия: неограничен

Опубликуйте пару ключей GPG и отправьте свой ключ на серверы GPG:

gpg --keyserver keys.gnupg.net --send-keys 736AD6032D072F9E452911D5C7F6E84396D004C4
Не волнуйтесь, эта команда отправит только публичный ключ.

Сначала перейдем в глобальные настройки Maven в папке .m2/settings.xml. Необходимо указать логин и пароль от OSSRH.


<settings>
    <servers>
        <server>
            <id>ossrh</id>
            <username>your-jira-id</username>
            <password>your-jira-pwd</password>
        </server>
    </servers>
</settings>

Создадим новый профиль мавена, чтобы указать данные PGP ключа.


// ... ... ... ... ...

    <profiles>
        <profile>
            <id>ossrh</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <gpg.keyname>PGP_KEY</gpg.keyname>
                <gpg.passphrase>YOU_PASSWORD</gpg.passphrase>
            </properties>
        </profile>
    </profiles>

// ... ... ... ... ...

После сохранения файла settings.xml перезапустите Idea, чтобы новый профиль появился в списке.
Maven профили

Переходим в pom.xml вашего приложения. Укажем название, описание и ссылку на проект.

// ... ... ... ... ...

<name>uPagge Utils</name>
<description>An example to demonstrate the ability to publish to Maven Central</description>
<url>https://blog.upagge.ru/posts/guide/2021/deploy-to-maven-central/</url>

// ... ... ... ... ...

Эта информация будет использоваться в описании компонента в Maven Central.

Также указываем информацию о системе контроля версий.

// ... ... ... ... ...

<scm>
    <connection>scm:git:https://gitlab.com/uPagge/upagge-utils.git</connection>
    <url>https://gitlab.com/uPagge/upagge-utils</url>
    <developerConnection>scm:git:https://gitlab.com/uPagge/upagge-utils.git</developerConnection>
</scm>

// ... ... ... ... ...

После этого добавляем ссылки на репозитории

// ... ... ... ... ...

<distributionManagement>
    <snapshotRepository>
        <id>ossrh</id>
        <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>

// ... ... ... ... ...
С февраля 2021 года все новые проекты начали размещаться на https://s01.oss.sonatype.org/

Также обязательно нужно указать разработчиков:

// ... ... ... ... ...

<developers>
    <developer>
        <id>uPagge</id>
        <name>Struchkov Mark</name>
        <roles>
            <role>Lead</role>
        </roles>
        <url>https://uPagge.ru</url>
    </developer>
</developers>

// ... ... ... ... ...

Все, можно опубликовывать. Делается это просто. Активируйте профиля, которые мы создали ранее и запустите команду мавена:


mvn clean deploy

// ... ... ... ... ...

[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "ruupagge-1003".

Waiting for operation to complete...
...

[INFO] Remote staged 1 repositories, finished with success.
[INFO] Remote staging repositories are being released...

Waiting for operation to complete...
...

[INFO] Remote staging repositories released.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  34.159 s
[INFO] Finished at: 2021-04-02T19:49:31+03:00
[INFO] ------------------------------------------------------------------------

Переходим в и воспользовавшись поиском находим нашу библиотеку в Sonatype OSSHR.
Результаты поиска по nexus

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

Сообщение об успешном включении синхронизации для Maven Central

Переходим в Maven Central и через поиск находим нашу либу.

Поиск нашей библиотеки в Maven Central

Успех! Теперь любой разработчик сможет воспользоваться вашей библиотекой.

Комментарии