如何将 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]
如何修复?
假设你有两个选择:
- 将插件的版本
<version>1.0.0</version>
从 1.0.0 增加到 1.0.1。如果插件不稳定且正在开发中,请考虑使用 1.0.1-SNAPSHOT 版本。 GitHub 允许使用 SNAPSHOT 版本重新部署工件。所以你总是可以在开发时重新部署它。
- 从存储库中删除包。您只能对私有 repository.
中的包执行此操作
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
。原因是上传的工件对应的标签还不存在。
在这种情况下,错误信息可能会更好。
假设我有一个 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]
如何修复?
假设你有两个选择:
- 将插件的版本
<version>1.0.0</version>
从 1.0.0 增加到 1.0.1。如果插件不稳定且正在开发中,请考虑使用 1.0.1-SNAPSHOT 版本。 GitHub 允许使用 SNAPSHOT 版本重新部署工件。所以你总是可以在开发时重新部署它。 - 从存储库中删除包。您只能对私有 repository. 中的包执行此操作
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
。原因是上传的工件对应的标签还不存在。
在这种情况下,错误信息可能会更好。