Исправить ошибку 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:
<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:
<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 видно
Содержание
- Почему возникает ошибка 422 в GitHub Packages
- Как исправить 422 при деплое в GitHub Packages — пошагово
- Исправленный pom.xml и settings.xml (примеры)
- Проверка токена и диагностика ошибок
- CI / GitHub Actions: пример публикации
- Частые причины и быстрые решения (чеклист)
- Источники
- Заключение
Почему возникает ошибка 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:packages (и read:packages при установке). Документация описывает требования и пример проверки токена через curl. -
SNAPSHOT vs release: для SNAPSHOT‑версий нужно включить snapshots в конфигурации репозитория (вы уже включили snapshots в settings.xml, проверьте версию при деплое).
Итог: ошибка 422 — не абстрактная “серверная проблема”, а обычно конкретная проверяемая причина (регистры символов, права токена, конфликт координат).
Как исправить 422 при деплое в GitHub Packages — пошагово
- Проверьте и исправьте artifactId (первое, что делать)
- Что сделать: в pom.xml замените
MonetaLib на строчный вариант, например:
<artifactId>monetalib</artifactId>
- Почему: GitHub отклоняет артефакты с заглавными буквами в имени (см. ссылку выше). После изменения пересоберите и пробуйте деплой.
- Заполните settings.xml личным токеном (PAT) с нужными правами
- Убедитесь, что в ~/.m2/settings.xml в секции
для github стоитваш логин иPERSONAL_ACCESS_TOKEN . В примере вашего settings.xml пароль пуст — это прямой источник ошибки аутентификации. Документация по PAT и правам: GitHub Docs — Maven registry.
- Проверьте совпадение id в distributionManagement и servers
- В pom.xml repository.id должно совпадать со
в settings.xml. У вас обоих id = github — это правильно. Но проверьте, что вы действительно используете тот settings.xml при запуске mvn (путь по умолчанию ~/.m2/settings.xml или -s).
- Убедитесь в корректности URL в distributionManagement
- Пример корректного URL: https://maven.pkg.github.com/OWNER/REPOSITORY — в вашем POM: https://maven.pkg.github.com/ilezzov-code/MonetaLib (OWNER = ilezzov-code). Обычно регистр в имени репозитория не критичен, но лучше точно указывать путь, как в GitHub.
- Проверьте на коллизию пакетов между репозиториями
- Зайдите в GitHub → Your profile → Packages или прямо на страницу пакетов пользователя: https://github.com/users/ilezzov-code/packages?repo_name=MonetaLib и убедитесь, что пакет с такими координатами не привязан к другому репозиторию. Если есть конфликт — либо удалить старый пакет, либо изменить groupId/artifactId (и заново опубликовать).
- Протестируйте токен простым curl‑запросом
- Команда:
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 — смотрите тело ответа и логи.
- Запустите mvn с включённым логированием и смотрите тело ответа сервера
- Команда:
mvn -s ~/.m2/settings.xml -X clean deploy
- Что смотреть: в логах ищите ответ сервера и его тело — часто там будет явная строка вроде “Cannot upload package with uppercase letters in artifactId” или сообщение о том, что пакет уже привязан к другому репозиторию.
- Если не помогло — смещайте версию или временно переименуйте артефакт
- Измените version (например, 1.0.1) или artifactId — это создаст новый набор координат и обойдёт конфликт; но правильнее удалить конфликтующий пакет или пересвязать.
Исправленный pom.xml и settings.xml (примеры)
Ниже — минимально изменённые варианты, основанные на вашем POM/Settings: главное — artifactId строчный и в settings.xml указан PAT.
Пример pom.xml (исправлено artifactId):
<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 (укажите реальный токен в
<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:
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.id ≠ server.id → привести к одному значению (например, github).
- В репозитории уже есть пакет с такими же координатами, но привязан к другому repo → удалить старый пакет или сменить coordinates.
- SNAPSHOT‑версия? Убедитесь, что snapshots.enabled = true.
- Протестировал curl → получил 200? Если нет — проблема с токеном/доступом.
- mvn -X deploy → изучите тело ответа сервера: там часто очевидная подсказка.
Источники
- https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry
- https://stackoverflow.com/questions/64322121/publishing-github-packages-returns-422-error
- https://github.com/orgs/community/discussions/23474
- https://github.com/orgs/community/discussions/26328
- https://github.com/users/ilezzov-code/packages?repo_name=MonetaLib
- https://github.com/ilezzov-code/MonetaLib
Заключение
Коротко: чаще всего 422 при деплое в GitHub Packages решается приведением artifactId к строчным буквам и корректной настройкой settings.xml с личным токеном (write:packages). Если после приведения artifactId проблема остаётся — проверьте коллизии пакетов между репозиториями и содержание ответа сервера (через mvn -X или curl). Сделайте эти три шага в порядке: исправить artifactId → заполнить PAT → проверить конфликты — и деплой должен пройти.