如何将 Maven 插件上传到 Github 个包?

How to upload maven plugin to Github packages?

假设我有一个 Maven 插件项目,我想将它发布到 Github 的 public Maven 存储库,名为 "Github Packages"。我已经按 instruction 完成了所有工作,对于普通项目,开箱即用,一切正常。但是对于带有 packaging=maven-plugin 的 Maven 插件项目,该指令不起作用。

在构建日志中,我看到类似这样的内容:

[WARNING] Could not transfer metadata repo-name/maven-metadata.xml from/to github (https://maven.pkg.github.com/user-name/repo-name): Failed to transfer file: https://maven.pkg.github.com/user-name/repo-name/group-id/maven-metadata.xml. Return code is: 422 , ReasonPhrase:Unprocessable Entity.

似乎 maven 部署插件需要 maven-metadata.xml 在 group-id 的根目录中,但找不到它,也没有人把它放在那里。如何解决这个问题?

我使用 Apache Maven 3.3.9,并使用命令:

mvn clean deploy

--补充:我使用的pom文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<repositories>
    <repository>
        <id>central</id>
        <url>https://repo1.maven.org/maven2</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>github</id>
        <name>GitHub my_repo Apache Maven Packages</name>
        <url>https://maven.pkg.github.com/my_nick/my_repo</url>
    </repository>
</repositories>

<version>1.0.0</version>
<groupId>x</groupId>
<artifactId>some-plugin</artifactId>
<packaging>maven-plugin</packaging>

<dependencies>
    <dependency>
        <groupId>x</groupId>
        <artifactId>my-dependency</artifactId>
        <version>1.0.0</version>
    </dependency>

    <dependency>
        <groupId>com.github.javaparser</groupId>
        <artifactId>javaparser-core</artifactId>
        <version>3.15.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.6.3</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-plugin-plugin</artifactId>
            <version>3.6.0</version>
        </plugin>
    </plugins>
</build>
</project>

这里是 official github link for how to do exactly that. However, since this doesn't seem to be of much help, here's a link to a gradle forum question,应该可以帮助您解决这个问题。祝你好运!

如果您已经将工件上传到 GitHub 包,那么这意味着您已经正确配置了所有内容。

我想 422 错误的真正原因是您试图上传与已上传的 相同版本 相同的工件。如果它不是 SNAPSHOT 版本,那么存储库应该拒绝替换它以使其正常运行。

我在尝试重新部署已经部署的包时遇到了同样的错误:

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project MavenPluginForGithub: 
Failed to deploy artifacts: Could not transfer artifact ru.dmochalov:SampleMavenPluginForGithub:jar:1.0.3 from/to github (https://maven.pkg.github.com/dmochalov/hello-world): 
Failed to transfer file: https://maven.pkg.github.com/dmochalov/hello-world/ru/dmochalov/SampleMavenPluginForGithub/1.0.3/SampleMavenPluginForGithub-1.0.3.jar. 
Return code is: 422, ReasonPhrase: Unprocessable Entity. -> [Help 1]

如何修复?

假设你有两个选择:

  1. 将插件的版本 <version>1.0.0</version> 从 1.0.0 增加到 1.0.1。如果插件不稳定且正在开发中,请考虑使用 1.0.1-SNAPSHOT 版本。 GitHub 允许使用 SNAPSHOT 版本重新部署工件。所以你总是可以在开发时重新部署它。
  2. 从存储库中删除包。您只能对私有 repository.
  3. 中的包执行此操作

422 错误与 401 错误

我想错误代码没有公认的规范或标准化,并且不同的存储库表现不同。例如,Maven Central 存储库在尝试替换已部署的版本时会回复 401 error。 为什么 GitHub 决定使用 422 是个谜。社区论坛中有一个 answer 但没有适当的解释。

不幸的是,我还没有找到我的问题的正确答案,似乎目前无法将 Maven 插件添加到 Github 包中。

不过我找到了一个解决方法,它使用 S3 作为存储库后端,因此您不需要像 Nexus 或 JFrog 这样的重量级解决方案。您可以阅读 this and this 如何操作。

在将 Maven 工件从 GitHub 操作发布到 GitHub 包时,我遇到了同样的问题 422 from server: Unprocessable Entity。原因是上传的工件对应的标签还不存在。

在这种情况下,错误信息可能会更好。