DevOps

Исправить ошибку 422 при деплое Maven в GitHub Packages

Пошаговое решение ошибки 422 при mvn deploy в GitHub Packages: исправьте artifactId (строчные буквы), настройте PAT с write:packages, проверьте коллизии пакетов и URL. Примеры pom.xml и settings.xml.

Как исправить ошибку 422 при деплое Maven проекта в GitHub Packages? Возникает ошибка 422 при попытке деплоя в GitHub Packages. Все проверил по сто раз уже, не понимаю в чем проблему.

Мой pom.xml:

xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>ru.ilezzov</groupId>
 <artifactId>MonetaLib</artifactId>
 <version>1.0.0</version>
 <packaging>jar</packaging>

 <name>MonetaLib</name>
 <description>It is a lightweight and powerful library for working with accounting data.</description>
 <url>https://github.com/ilezzov-code/MonetaLib</url>

 <developers>
 <developer>
 <id>ILeZzoV</id>
 <name>Ilya Morozov</name>
 <email>ilezov.morozov@yandex.ru</email>
 <organization>ilezzov-code</organization>
 </developer>
 </developers>

 <distributionManagement>
 <repository>
 <id>github</id>
 <name>GitHub ilezzov-code Apache Maven Packages</name>
 <url>https://maven.pkg.github.com/ilezzov-code/MonetaLib</url>
 </repository>
 </distributionManagement>

 <build>
 <plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>3.11.0</version>
 <configuration>
 <source>17</source>
 <target>17</target>
 <compilerArgs>
 <arg>-parameters</arg>
 </compilerArgs>
 </configuration>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-jar-plugin</artifactId>
 <version>3.3.0</version>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-shade-plugin</artifactId>
 <version>3.6.0</version>
 <executions>
 <execution>
 <phase>package</phase>
 <goals><goal>shade</goal></goals>
 </execution>
 </executions>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-javadoc-plugin</artifactId>
 <version>3.5.0</version>
 <executions>
 <execution>
 <id>attach-javadocs</id>
 <goals>
 <goal>jar</goal>
 </goals>
 </execution>
 </executions>
 </plugin>
 </plugins>
 </build>

 <dependencies>
 <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
 <dependency>
 <groupId>org.postgresql</groupId>
 <artifactId>postgresql</artifactId>
 <version>42.7.8</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine -->
 <dependency>
 <groupId>com.github.ben-manes.caffeine</groupId>
 <artifactId>caffeine</artifactId>
 <version>2.8.0</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
 <dependency>
 <groupId>com.h2database</groupId>
 <artifactId>h2</artifactId>
 <version>2.4.240</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
 <dependency>
 <groupId>com.google.api-client</groupId>
 <artifactId>google-api-client</artifactId>
 <version>2.8.1</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client -->
 <dependency>
 <groupId>com.google.oauth-client</groupId>
 <artifactId>google-oauth-client</artifactId>
 <version>1.39.0</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-sheets -->
 <dependency>
 <groupId>com.google.apis</groupId>
 <artifactId>google-api-services-sheets</artifactId>
 <version>v4-rev20250616-2.0.0</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
 <dependency>
 <groupId>com.google.code.gson</groupId>
 <artifactId>gson</artifactId>
 <version>2.13.2</version>
 </dependency>
 </dependencies>
</project>

мой settings.xml:

xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
 http://maven.apache.org/xsd/settings-1.0.0.xsd">

 <activeProfiles>
 <activeProfile>github</activeProfile>
 </activeProfiles>

 <profiles>
 <profile>
 <id>github</id>
 <repositories>
 <repository>
 <id>central</id>
 <url>https://repo.maven.apache.org/maven2</url>
 </repository>
 <repository>
 <id>github</id>
 <url>https://maven.pkg.github.com/ilezzov-code/MonetaLib</url>
 <snapshots>
 <enabled>true</enabled>
 </snapshots>
 </repository>
 </repositories>
 </profile>
 </profiles>

 <servers>
 <server>
 <id>github</id>
 <username>ilezzov-code</username>
 <password></password>
 </server>
 </servers>
</settings>/

Репозиторий: https://github.com/ilezzov-code/MonetaLib

Ошибка 422 при mvn deploy в GitHub Packages (github packages) чаще всего вызвана недопустимым artifactId (заглавные буквы), коллизией артефакта между репозиториями или пустым/неправильным PAT в settings.xml. В вашем POM видно MonetaLib — приведите его к строчным (например, monetalib или moneta-lib), заполните в ~/.m2/settings.xml личным токеном с правами write:packages, и проверьте URL в distributionManagement. Ниже — пошаговая диагностика, исправленные примеры pom.xml/settings.xml и команды для проверки.


Содержание


Почему возникает ошибка 422 в GitHub Packages

Причины 422 при публикации в GitHub Packages обычно сводятся к трём вещам — неверные координаты пакета, проблемы с аутентификацией, или коллизии между репозиториями.

  • Заглавные буквы в artifactId. Официальная документация указывает, что использование заглавных букв в имени артефакта приводит к 422: “If you use uppercase letters in the artifact name, you’ll get a 422 Unprocessable Entity response.” См. Working with the Apache Maven registry. Практические кейсы на Stack Overflow подтверждают ту же ошибку и тело ответа сервера с текстом об uppercase‑символах — пример обсуждения на Stack Overflow.

  • Коллизия пакета между репозиториями одного владельца. Если пакет с теми же координатами (groupId:artifactId:version) уже зарегистрирован и связан с другим репозиторием, GitHub отклонит новый деплой. Сообщество GitHub неоднократно описывало этот сценарий и даёт рекомендации по удалению/переименованию пакета как обходному пути — GitHub Community discussion.

  • Отсутствие или неверный PAT (personal access token). В settings.xml поле должно содержать токен (classic) с правами write:packagesread:packages при установке). Документация описывает требования и пример проверки токена через curl.

  • SNAPSHOT vs release: для SNAPSHOT‑версий нужно включить snapshots в конфигурации репозитория (вы уже включили snapshots в settings.xml, проверьте версию при деплое).

Итог: ошибка 422 — не абстрактная “серверная проблема”, а обычно конкретная проверяемая причина (регистры символов, права токена, конфликт координат).


Как исправить 422 при деплое в GitHub Packages — пошагово

  1. Проверьте и исправьте artifactId (первое, что делать)
  • Что сделать: в pom.xml замените MonetaLib на строчный вариант, например:
xml
<artifactId>monetalib</artifactId>
  • Почему: GitHub отклоняет артефакты с заглавными буквами в имени (см. ссылку выше). После изменения пересоберите и пробуйте деплой.
  1. Заполните settings.xml личным токеном (PAT) с нужными правами
  • Убедитесь, что в ~/.m2/settings.xml в секции для github стоит ваш логин и PERSONAL_ACCESS_TOKEN. В примере вашего settings.xml пароль пуст — это прямой источник ошибки аутентификации. Документация по PAT и правам: GitHub Docs — Maven registry.
  1. Проверьте совпадение id в distributionManagement и servers
  • В pom.xml repository.id должно совпадать со в settings.xml. У вас обоих id = github — это правильно. Но проверьте, что вы действительно используете тот settings.xml при запуске mvn (путь по умолчанию ~/.m2/settings.xml или -s).
  1. Убедитесь в корректности URL в distributionManagement
  1. Проверьте на коллизию пакетов между репозиториями
  • Зайдите в GitHub → Your profile → Packages или прямо на страницу пакетов пользователя: https://github.com/users/ilezzov-code/packages?repo_name=MonetaLib и убедитесь, что пакет с такими координатами не привязан к другому репозиторию. Если есть конфликт — либо удалить старый пакет, либо изменить groupId/artifactId (и заново опубликовать).
  1. Протестируйте токен простым curl‑запросом
  • Команда:
bash
curl -u ilezzov-code:PERSONAL_ACCESS_TOKEN https://maven.pkg.github.com/ilezzov-code/MonetaLib -I
  • Ожидание: HTTP/1.1 200 OK — значит токен и доступ к registry в порядке. Если 401/403/422 — смотрите тело ответа и логи.
  1. Запустите mvn с включённым логированием и смотрите тело ответа сервера
  • Команда:
bash
mvn -s ~/.m2/settings.xml -X clean deploy
  • Что смотреть: в логах ищите ответ сервера и его тело — часто там будет явная строка вроде “Cannot upload package with uppercase letters in artifactId” или сообщение о том, что пакет уже привязан к другому репозиторию.
  1. Если не помогло — смещайте версию или временно переименуйте артефакт
  • Измените version (например, 1.0.1) или artifactId — это создаст новый набор координат и обойдёт конфликт; но правильнее удалить конфликтующий пакет или пересвязать.

Исправленный pom.xml и settings.xml (примеры)

Ниже — минимально изменённые варианты, основанные на вашем POM/Settings: главное — artifactId строчный и в settings.xml указан PAT.

Пример pom.xml (исправлено artifactId):

xml
<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
 <modelVersion>4.0.0</modelVersion>
 <groupId>ru.ilezzov</groupId>
 <artifactId>monetalib</artifactId>
 <version>1.0.0</version>
 <packaging>jar</packaging>

 <name>MonetaLib</name>
 <description>Lightweight library for accounting data</description>
 <url>https://github.com/ilezzov-code/MonetaLib</url>

 <!-- developers, dependencies, plugins — оставьте как есть -->

 <distributionManagement>
 <repository>
 <id>github</id>
 <name>GitHub ilezzov-code Apache Maven Packages</name>
 <url>https://maven.pkg.github.com/ilezzov-code/MonetaLib</url>
 </repository>
 </distributionManagement>
</project>

Пример settings.xml (укажите реальный токен в ):

xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" ...>
 <activeProfiles>
 <activeProfile>github</activeProfile>
 </activeProfiles>

 <profiles>
 <profile>
 <id>github</id>
 <repositories>
 <repository>
 <id>central</id>
 <url>https://repo.maven.apache.org/maven2</url>
 </repository>
 <repository>
 <id>github</id>
 <url>https://maven.pkg.github.com/ilezzov-code/MonetaLib</url>
 <snapshots><enabled>true</enabled>
 </snapshots>
 </repository>
 </repositories>
 </profile>
 </profiles>

 <servers>
 <server>
 <id>github</id>
 <username>ilezzov-code</username>
 <password>PERSONAL_ACCESS_TOKEN</password>
 </server>
 </servers>
</settings>

Совет по безопасности: не храните PAT в открытом виде в репозитории. Для локальной работы можно хранить в ~/.m2/settings.xml (локально). Для CI используйте secrets и actions/setup-java (ниже пример).


Проверка токена и диагностика ошибок

  • Быстрая проверка доступа:
    curl -u ilezzov-code:PERSONAL_ACCESS_TOKEN https://maven.pkg.github.com/ilezzov-code/MonetaLib -I
    HTTP 200 → права и доступ ок. Любая 4xx/5xx ошибка → посмотреть тело ответа.

  • Логирование Maven:
    mvn -s ~/.m2/settings.xml -X clean deploy
    В моках (HTTP response body) GitHub часто возвращает понятное сообщение — ищите строки с “Cannot upload package” или упоминанием “already associated with a different repo”.

  • Что означают типичные ответы:

  • “Cannot upload package with uppercase letters in artifactId” → нужно перевести artifactId в lower-case (см. StackOverflow пример: https://stackoverflow.com/questions/64322121/publishing-github-packages-returns-422-error).

  • “Package already associated with a different repository” → коллизия; решается удалением старого пакета или сменой координат (groupId/artifactId).

  • Удаление конфликтующего пакета: через веб‑интерфейс GitHub — в разделе Packages (или на странице пакета), выберите пакет и удалите его вручную. После удаления повторите mvn deploy.


CI / GitHub Actions: пример публикации

Для CI удобнее не хранить токен в settings.xml вручную — используйте секреты и actions/setup-java, который может записать credentials в settings.xml автоматически.

Пример .github/workflows/publish.yml:

yaml
name: Publish to GitHub Packages
on:
 push:
 branches: [ main ]

jobs:
 publish:
 runs-on: ubuntu-latest
 steps:
 - uses: actions/checkout@v4
 - name: Set up JDK 17 and auth for Maven
 uses: actions/setup-java@v4
 with:
 distribution: temurin
 java-version: '17'
 server-id: github
 server-username: ${{ github.actor }}
 server-password: ${{ secrets.GH_PACKAGES_TOKEN }}
 - name: Build and deploy
 run: mvn -B -s $HOME/.m2/settings.xml -DskipTests clean deploy
  • Секрет GH_PACKAGES_TOKEN: персональный токен с write:packages (можно использовать GITHUB_TOKEN в некоторых сценариях, но PAT чаще надёжнее для cross-repo publishing).

Частые причины и быстрые решения (чеклист)

  • artifactId содержит заглавные буквы → заменить на lower-case.
  • в settings.xml пустой → поставить PAT с rights write:packages.
  • repository.idserver.id → привести к одному значению (например, github).
  • В репозитории уже есть пакет с такими же координатами, но привязан к другому repo → удалить старый пакет или сменить coordinates.
  • SNAPSHOT‑версия? Убедитесь, что snapshots.enabled = true.
  • Протестировал curl → получил 200? Если нет — проблема с токеном/доступом.
  • mvn -X deploy → изучите тело ответа сервера: там часто очевидная подсказка.

Источники

  1. https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry
  2. https://stackoverflow.com/questions/64322121/publishing-github-packages-returns-422-error
  3. https://github.com/orgs/community/discussions/23474
  4. https://github.com/orgs/community/discussions/26328
  5. https://github.com/users/ilezzov-code/packages?repo_name=MonetaLib
  6. https://github.com/ilezzov-code/MonetaLib

Заключение

Коротко: чаще всего 422 при деплое в GitHub Packages решается приведением artifactId к строчным буквам и корректной настройкой settings.xml с личным токеном (write:packages). Если после приведения artifactId проблема остаётся — проверьте коллизии пакетов между репозиториями и содержание ответа сервера (через mvn -X или curl). Сделайте эти три шага в порядке: исправить artifactId → заполнить PAT → проверить конфликты — и деплой должен пройти.

Авторы
Проверено модерацией
Модерация
Исправить ошибку 422 при деплое Maven в GitHub Packages