Как исправить ошибку 422 при деплое в GitHub Packages
Решение ошибки 422 при деплое Maven проекта в GitHub Packages. Основная причина - заглавные буквы в artifactId. Пошаговое руководство по исправлению.
Как исправить ошибку 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 при деплое Maven проекта в GitHub Packages чаще всего возникает из-за использования заглавных букв в artifactId. В вашем случае MonetaLib содержит заглавную букву “M”, что вызывает у сервера GitHub Packages проблему с обработкой пути. Простое изменение artifactId на monetalib (в нижний регистр) должно решить проблему.
Содержание
- Основная причина ошибки 422
- Другие возможные причины
- Пошаговое решение
- Предотвращение будущих проблем
- Альтернативные подходы
Основная причина ошибки 422
Ошибка 422 “Unprocessable Entity” при деплое в GitHub Packages чаще всего вызвана использованием заглавных букв в названии artifactId. Как показывают многочисленные отчеты разработчиков, GitHub Packages требует, чтобы artifactId был написан только строчными буквами.
В вашем файле pom.xml:
<artifactId>MonetaLib</artifactId>
Здесь MonetaLib начинается с заглавной буквы “M”, что именно и вызывает ошибку 422. Сервер GitHub Packages не может обработать путь, содержащий заглавные буквы, и возвращает ошибку “Unprocessable Entity”.
Важно: Maven в своем документации указывает, что artifactId “должен быть” в нижнем регистре, но не “обязан быть”. Однако GitHub Packages строго требует строчных букв для artifactId.
Другие возможные причины
Помимо проблемы с регистром букв, существуют и другие причины ошибки 422:
1. Конфликт имен артефактов
Если у вас в организации GitHub уже существует артефакт с таким же именем в другом репозитории, это может вызвать конфликт. Согласно одному из отчетов, ситуация усугубляется, когда разные репозитории пытаются развернуть артефакты с идентичными именами.
2. Неправильные учетные данные
Проблемы с аутентификацией могут иногда проявляться как ошибка 422. Убедитесь, что:
- GitHub Token имеет необходимые права
- В settings.xml правильно указаны учетные данные
3. Повторная попытка деплоя существующей версии
Если вы пытаетесь развернуть версию, которая уже существует, это может вызвать ошибку 422. В некоторых случаях помогает удаление неправильно развернутого пакета.
Пошаговое решение
Шаг 1: Измените artifactId на строчные буквы
Откройте ваш pom.xml и измените:
<artifactId>MonetaLib</artifactId>
на:
<artifactId>monetalib</artifactId>
Шаг 2: Обновите все ссылки
Если вы где-либо упоминаете имя артефакта (в документации, примерах кода), обновите и эти ссылки.
Шаг 3: Пересоберите проект
Выполните в корневой директории проекта:
mvn clean package
Шаг 4: Разверните снова
Теперь выполните деплой:
mvn deploy
Совет: Если вы используете GitHub Actions, убедитесь, что секрет
GITHUB_TOKENимеет права на запись в репозиторий.
Шаг 5: Альтернативный подход - переименование репозитория
Если вы хотите сохранить имя MonetaLib для публичного использования, можно:
- Оставить artifactId как
monetalib(строчными) - В репозитории создать файл
README.mdс правильным названием - В описании проекта указать полное имя
Предотвращение будущих проблем
1. Используйте соглашения об именовании
- Всегда используйте строчные буквы в groupId и artifactId
- Разделяйте слова дефисами, а не camelCase
- Пример:
ru.ilezzov.moneta-libвместоru.ilezzov.MonetaLib
2. Проверяйте перед деплоем
Добавьте в ваш workflow проверку:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<id>enforce-versions</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireLowercaseArtifactId/>
</rules>
</configuration>
</execution>
</executions>
</plugin>
3. Тестируйте на локальном уровне
Перед деплоем в GitHub Packages протестируйте деплой в локальный Maven репозиторий:
mvn deploy:deploy-file -Durl=file:///${user.home}/.m2/repository \
-DgroupId=ru.ilezzov -DartifactId=monetalib -Dversion=1.0.0 \
-Dpackaging=jar -Dfile=target/monetalib-1.0.0.jar
Альтернативные подходы
1. Использование Gradle
Если вы не хотите менять имя артефакта,可以考虑 переход на Gradle, который может быть более гибким в этом вопросе. Однако помните, что Gradle также может сталкиваться с похожими проблемами.
2. Переход на другой репозиторий
Если GitHub Packages продолжает вызывать проблемы, рассмотрите альтернативные варианты:
3. Использование алиасов
Можно создать символическую ссылку или использовать плагины для создания алиасов:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>create-alias</id>
<phase>package</phase>
<configuration>
<target>
<copy file="target/MonetaLib-1.0.0.jar" tofile="target/monetalib-1.0.0.jar"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Источники
- Stack Overflow - Publishing GitHub Packages returns 422 error
- GitHub Community - Maven deploy fails with status 422 unprocessable entity
- GitHub Community - Gradle Maven deploy failing with 422 Unprocessable Entity
- GitHub Community - Keep getting “Received status code 422 from server: Unprocessable Entity”
- GitHub Actions - maven -B deploy fails with 422 error
Заключение
Ошибка 422 при деплое в GitHub Packages почти всегда связана с использованием заглавных букв в artifactId. Для решения вашей проблемы:
- Измените artifactId с
MonetaLibнаmonetalibв вашем pom.xml - Пересоберите проект с помощью
mvn clean package - Разверните снова с помощью
mvn deploy
Эта простая правка решает проблему в большинстве случаев. Чтобы избежать подобных проблем в будущем, всегда используйте строчные буквы в groupId и artifactId, а также следуйте соглашениям об именовании Maven артефактов.
Если проблема останется после этих изменений, проверьте наличие конфликтов имен артефактов в вашей организации GitHub и убедитесь, что учетные данные настроены правильно.