# Публикация Java-пакетов с помощью Maven

В этом уроке вы узнаете, как использовать Maven для публикации пакетов Java в реестре в рамках вашего рабочего процесса непрерывной интеграции (CI).

## Введение

В этом руководстве показано, как создать рабочий процесс, который публикует пакеты Java в GitHub Packages и центральном репозитории Maven. С помощью одного рабочего процесса можно публиковать пакеты в одном репозитории или в нескольких.

> \[!WARNING] Примеры, используемые в этом руководстве, ссылаются на устаревшую службу OSSRH. См [. статью "Публикация](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing) " в документации по Центральному репозиторию Maven.

## Необходимые компоненты

Рекомендуется иметь базовое представление о файлах рабочих процессов и параметрах конфигурации. Дополнительные сведения см. в разделе [Написание рабочих процессов](/ru/enterprise-server@3.22/actions/how-tos/write-workflows).

Для получения дополнительной информации о создании CI-рабочего процесса для вашего Java проекта с Maven смотрите [Создание и тестирование Java с Maven](/ru/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-maven).

Также могут быть полезны базовые знания в следующих областях:

* [Работа с реестром Apache Maven](/ru/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [Хранение сведений в переменных](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [Использование GITHUB\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## Сведения о конфигурации пакета

Поля `groupId` и `artifactId` в файле *pom.xml* создают уникальный идентификатор для вашего пакета, который реестры используют для связывания вашего пакета с реестром. Дополнительные сведения см. в [руководстве по загрузке артефактов в центральный репозиторий](https://maven.apache.org/repository/guide-central-repository-upload.html) в документации по Apache Maven.

> \[!WARNING] Пакет Apache Maven должен соответствовать соглашению об именовании, поэтому `artifactId` поле должно содержать только строчные буквы, цифры или дефисы. Дополнительные сведения см. в разделе ["Соглашение об именовании](https://maven.apache.org/guides/mini/guide-naming-conventions.html) координат Maven" в документации по maven.apache.org. Если в имени артефакта используются прописные буквы, вы получите *ответ 422 Unprocessable Entity* .

Файл *pom.xml* также содержит конфигурацию для репозиториев управления распределением, в которые Maven будет развертывать пакеты. Каждый репозиторий должен иметь имя и URL-адрес развертывания. Проверку подлинности для этих репозиториев можно настроить в файле *.m2/settings.xml* в домашнем каталоге пользователя, запустившего Maven.

Вы можете использовать действие `setup-java` для настройки репозитория развертывания, а также проверки подлинности для этого репозитория. Дополнительные сведения см. в статье [`setup-java`](https://github.com/actions/setup-java).

## Публикация пакетов в центральный репозиторий Maven

При каждом создании выпуска можно активировать рабочий процесс для публикации пакета. Рабочий процесс в приведенном ниже примере выполняется при активации события `release` с типом `created`. Если тесты CI проходят успешно, рабочий процесс публикует пакет в центральный репозитории Maven. Дополнительные сведения о событии см. в `release` разделе [События, инициирующие рабочие процессы](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release).

В этом рабочем процессе вы можете использовать действие `setup-java`. Это действие устанавливает заданную версию JDK в `PATH`, а также настраивает файл Maven *settings.xml* для публикации пакетов. По умолчанию файл параметров будет настроен GitHub Packagesдля, но его можно настроить для развертывания в другом реестре пакетов, например в центральном репозитории Maven. Если у вас уже есть репозиторий управления распределением, настроенный в *pom.xml*, вы можете указать этот `id` во время вызова действия `setup-java`.

Например, если вы выполняли развертывание в центральном репозитории Maven через проект размещения OSSRH, ваш файл *pom.xml* мог указать репозиторий управления распределением с `id``ossrh`.

```xml copy
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>ossrh</id>
      <name>Central Repository OSSRH</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>
```

С помощью этой конфигурации вы можете создать рабочий процесс, который публикует ваш пакет в центральном репозитории Maven, указав `id` управления репозиторием в действии `setup-java`. Вам также необходимо указать переменные среды, содержащие имя пользователя и пароль для проверки подлинности в репозитории.

На этапе развертывания вам нужно будет установить переменные среды для имени пользователя, с помощью которого вы будете выполнять проверку подлинности в репозитории, и для секрета, который вы настроили с помощью пароля или маркера для проверки подлинности. Дополнительные сведения см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

```yaml copy
name: Publish package to the Maven Central Repository
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Maven Central Repository
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
```

Этот рабочий процесс выполняет следующие действия:

1. Извлекает копию репозитория проекта.
2. Настраивает Java JDK, а также настраивает файл Maven *settings.xml* для добавления аутентификации для репозитория `ossrh` с помощью переменных среды `MAVEN_USERNAME` и `MAVEN_PASSWORD`.
3. Выполняет команду `mvn --batch-mode deploy` для публикации в репозиторий `ossrh`. Переменная среды `MAVEN_USERNAME` будет задана с содержимым секрета `OSSRH_USERNAME`, а переменная среды `MAVEN_PASSWORD` — с содержимым секрета `OSSRH_TOKEN`.

   Дополнительные сведения об использовании секретов в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

## Публикация пакетов в GitHub Packages

При каждом создании выпуска можно активировать рабочий процесс для публикации пакета. Рабочий процесс в приведенном ниже примере выполняется при активации события `release` с типом `created`. Рабочий процесс публикует пакет, если GitHub Packages тесты CI проходят. Дополнительные сведения о событии см. в `release` разделе [События, инициирующие рабочие процессы](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release).

В этом рабочем процессе вы можете использовать действие `setup-java`. Это действие устанавливает указанную версию JDK в `PATH`пакет, а также настраивает *settings.xml* Maven для публикации пакета GitHub Packages. Сгенерированный файл *settings.xml* определяет проверку подлинности для сервера с `id``github`, используя переменную среды `GITHUB_ACTOR` в качестве имени пользователя и переменную среды `GITHUB_TOKEN` в качестве пароля. Переменной среды `GITHUB_TOKEN` присваивается значение специального секрета `GITHUB_TOKEN`.

Секрет `GITHUB_TOKEN` устанавливается в качестве маркера доступа для репозитория при каждом запуске задания в рабочем процессе. Необходимо задать разрешения для этого маркера доступа в файле рабочего процесса, чтобы предоставить доступ для чтения для `contents` разрешения и доступа на запись для `packages` разрешения. Дополнительные сведения см. в разделе [Использование GITHUB\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token).

Для проекта на основе Maven можно использовать эти параметры, создав репозиторий дистрибутива в файле *pom.xml* с `id``github` указанием этой точки конечной GitHub Packages точки.

Например, если ваша организация называется octocat, а репозиторий называется hello-world, GitHub Packages то конфигурация в *pom.xml* будет выглядеть примерно так, как показано в следующем примере.

```xml copy
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>github</id>
      <name>GitHub Packages</name>
      <url>https://maven.pkg.github.com/octocat/hello-world</url>
    </repository>
  </distributionManagement>
</project>
```

С помощью этой конфигурации можно создать рабочий процесс, который публикует пакет GitHub Packages , используя автоматически созданный *settings.xml*.

```yaml copy
name: Publish package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Этот рабочий процесс выполняет следующие действия:

1. Извлекает копию репозитория проекта.
2. Настраивает Java JDK, а также автоматически настраивает файл Maven *settings.xml* для добавления аутентификации для репозитория `github` Maven с использованием переменной среды `GITHUB_TOKEN`.
3. Выполняет команду для публикации `mvn --batch-mode deploy` в GitHub Packages. Переменная среды `GITHUB_TOKEN` будет задана с содержимым секрета `GITHUB_TOKEN`. Ключ `permissions` указывает доступ, предоставленный для `GITHUB_TOKEN`.

   Дополнительные сведения об использовании секретов в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

## Публикация пакетов в центральном репозитории Maven и GitHub Packages

Пакеты можно опубликовать в центральном репозитории Maven и GitHub Packages с помощью `setup-java` действия для каждого реестра.

Убедитесь, \_ что файлpom.xml\_ включает репозиторий управления дистрибутивом как для вашего репозитория, так GitHub и для поставщика центрального репозитория Maven. Например, если вы развертываете в центральном репозитории через проект размещения OSSRH, его может потребоваться указать в репозитории управления распределением с `id` заданным значением `ossrh`, и может потребоваться указать GitHub Packages в репозитории управления распределением с заданным значением `id``github`.

```yaml copy
name: Publish package to the Maven Central Repository and GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java for publishing to Maven Central Repository
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish to the Maven Central Repository
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
      - name: Set up Java for publishing to GitHub Packages
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Publish to GitHub Packages
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Этот рабочий процесс дважды вызывает действие `setup-java`. При каждом запуске действия `setup-java` оно перезаписывает файл Maven *settings.xml* для публикации пакетов. Для проверки подлинности в репозитории файл *settings.xml* содержит ссылку на репозиторий управления распределением `id`, а также на имя пользователя и пароль.

Этот рабочий процесс выполняет следующие действия:

1. Извлекает копию репозитория проекта.
2. Вызывает `setup-java` в первый раз. В результате выполняется настройка файла Maven *settings.xml* для репозитория `ossrh` и установка параметров проверки подлинности для переменных среды, которые определяются на следующем шаге.
3. Выполняет команду `mvn --batch-mode deploy` для публикации в репозиторий `ossrh`. Переменная среды `MAVEN_USERNAME` будет задана с содержимым секрета `OSSRH_USERNAME`, а переменная среды `MAVEN_PASSWORD` — с содержимым секрета `OSSRH_TOKEN`.
4. Вызывает `setup-java` во второй раз. Это автоматически настраивает файл Maven *settings.xml* для GitHub Packages.
5. Выполняет команду для публикации `mvn --batch-mode deploy` в GitHub Packages. Переменная среды `GITHUB_TOKEN` будет задана с содержимым секрета `GITHUB_TOKEN`. Ключ `permissions` указывает доступ, предоставленный для `GITHUB_TOKEN`.

   Дополнительные сведения об использовании секретов в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).