Другое

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

Решение ошибки 422 при деплое Maven проекта в GitHub Packages. Основная причина - заглавные буквы в artifactId. Пошаговое руководство по исправлению.

Как исправить ошибку 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 при деплое Maven проекта в GitHub Packages чаще всего возникает из-за использования заглавных букв в artifactId. В вашем случае MonetaLib содержит заглавную букву “M”, что вызывает у сервера GitHub Packages проблему с обработкой пути. Простое изменение artifactId на monetalib (в нижний регистр) должно решить проблему.

Содержание


Основная причина ошибки 422

Ошибка 422 “Unprocessable Entity” при деплое в GitHub Packages чаще всего вызвана использованием заглавных букв в названии artifactId. Как показывают многочисленные отчеты разработчиков, GitHub Packages требует, чтобы artifactId был написан только строчными буквами.

В вашем файле pom.xml:

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 и измените:

xml
<artifactId>MonetaLib</artifactId>

на:

xml
<artifactId>monetalib</artifactId>

Шаг 2: Обновите все ссылки

Если вы где-либо упоминаете имя артефакта (в документации, примерах кода), обновите и эти ссылки.

Шаг 3: Пересоберите проект

Выполните в корневой директории проекта:

bash
mvn clean package

Шаг 4: Разверните снова

Теперь выполните деплой:

bash
mvn deploy

Совет: Если вы используете GitHub Actions, убедитесь, что секрет GITHUB_TOKEN имеет права на запись в репозиторий.

Шаг 5: Альтернативный подход - переименование репозитория

Если вы хотите сохранить имя MonetaLib для публичного использования, можно:

  1. Оставить artifactId как monetalib (строчными)
  2. В репозитории создать файл README.md с правильным названием
  3. В описании проекта указать полное имя

Предотвращение будущих проблем

1. Используйте соглашения об именовании

  • Всегда используйте строчные буквы в groupId и artifactId
  • Разделяйте слова дефисами, а не camelCase
  • Пример: ru.ilezzov.moneta-lib вместо ru.ilezzov.MonetaLib

2. Проверяйте перед деплоем

Добавьте в ваш workflow проверку:

xml
<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 репозиторий:

bash
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. Использование алиасов

Можно создать символическую ссылку или использовать плагины для создания алиасов:

xml
<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>

Источники

  1. Stack Overflow - Publishing GitHub Packages returns 422 error
  2. GitHub Community - Maven deploy fails with status 422 unprocessable entity
  3. GitHub Community - Gradle Maven deploy failing with 422 Unprocessable Entity
  4. GitHub Community - Keep getting “Received status code 422 from server: Unprocessable Entity”
  5. GitHub Actions - maven -B deploy fails with 422 error

Заключение

Ошибка 422 при деплое в GitHub Packages почти всегда связана с использованием заглавных букв в artifactId. Для решения вашей проблемы:

  1. Измените artifactId с MonetaLib на monetalib в вашем pom.xml
  2. Пересоберите проект с помощью mvn clean package
  3. Разверните снова с помощью mvn deploy

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

Если проблема останется после этих изменений, проверьте наличие конфликтов имен артефактов в вашей организации GitHub и убедитесь, что учетные данные настроены правильно.

Авторы
Проверено модерацией
Модерация