2022 最新版 JAVA 如何上传自己的jar包到Maven中央仓库
发布 Jar 包到 Maven 中央仓库
在项目开发过程中,我们常常会使用 Maven / Gradle 从仓库拉取开源的第三方 jar 包,可能是私有仓库,可能是 Maven 中央仓库,也可能是第三方的镜像。本文将一些简单实用的操作步骤和示例,带领大家将自己写好的代码或开源项目发布到 Maven中央仓库(https://mvnrepository.com/)中,让其他人可以直接依赖你的 jar 包,而不需要先下载你的代码 / jar 后 install 到本地。。
Maven中央仓库并不支持直接发布 jar 包,需要将 jar 包发布到一些指定的第三方Maven仓库,然后该仓库再将 jar 包同步到 Maven中央仓库,Sonatype便是 Maven中央仓库指定的暂存库。
1. 注册帐号
入口有点难找,提示一下,在 Build 选项卡里面
https://issues.sonatype.org/secure/Signup!default.jspa
密码设置十分变态,12位,必须包含大小写数字特殊字符,有必要拿小本本记一下。而且最好不要设置在
xml
中需要转义的特殊字符,比如&
,否则后面配置xml
时还要转义!不要问我为啥知道的。。
2. Jira申请
点击新建按钮或者直接访问 https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134,提一个 issue
,只有申请通过了才有可能上传到中央仓库上,一般 5 分钟左右会有回应,我昨晚 10 点左右申请的,不知道是不是时差问题他们回应比较快:
- Project选择【Community Support - Open Source Project Repository Hosting (OSSRH)】
- Issue Type:选择【New Project】
- Summary和Description :自己填,注意要用英文
- Group Id:这个必须要注意,如果你用的是GitHub, 一定要是 io.github.你的github用户名, 例如我的项目地址是: https://github.com/admin4j/common-http, 那我的 groupId就是
io.github.admin4j
.如果你有自己的域名和项目地址也可以,官方人员会询问你是否有这个域名的所有权.在你项目的pom里一定要使用这个groupId,最好包路径也使用 - Project URL: 是你的项目地址
- SCM url: 是你的项目git地址
- Username(s): 可以不用填,这是能辅助你提交项目的合作人的帐号,前提是他也得在这个Jira注册
其他使用默认值就行了
大概十分钟会收到恢复,如果你的 Group Id 随便写的话会出下面的问题
这时需要我们修改认证方式。再次提交。第二次审核大概要两三个小时,最终审核结果:
可以参考我的申请 https://issues.sonatype.org/browse/OSSRH-80732
3. gpg 环境安装
gpg的主要作用是生成密钥对,会用于后续我们组件发布的校验。
- 1、下载地址: https://www.gnupg.org/download/, 安装时会附带安装UI程序kleopatra
- 2、在安装完成后,运行kleopatra程序,新建密钥对
- 3、导出证书 发布证书
命令行模式
···
#生成(按照提示,依次输入用户名、邮箱。最后输入O)
gpg --gen-key
#查看
gpg --list-keys
···
4. 配置 Maven setting
配置 sonatype的账号密码 用户名和密码是第一步中注册的JIRA的
<!-- Sonatype的用户名密码 -->
<servers>
<server>
<id>ossrh</id>
<username>rxc</username>
<password>Sonatype1234@</password>
</server>
</servers>
如果gpg 有密码时,也可以使用Maven 参数的形式
<settings>
<profiles>
<profile>
<id>gpg</id>
<properties>
<gpg.executable>gpg</gpg.executable>
<gpg.passphrase>your password</gpg.passphrase>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>gpg</activeProfile>
</activeProfiles>
</settings>
5. 配置 Maven setting
在项目的pom.xml文件中,配置相应的开源协议、仓库信息、开发人员信息和发布配置
<url>https://github.com/andanyoung</url>
<!-- 开源签名证书 -->
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<!-- 仓库信息 -->
<scm>
<connection>scm:git@github.com:admin4j/common-http.git</connection>
<developerConnection>scm:git@github.com:admin4j/common-http.git
</developerConnection>
<url>https://github.com/admin4j/common-http</url>
</scm>
<!-- 开发人员信息 -->
<developers>
<developer>
<name>admin4j</name>
<email>1218853253@qq.com</email>
<organization>https://github.com/andanyoung</organization>
<timezone>+8</timezone>
</developer>
</developers>
<!-- 发布项目到 sonatype -->
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
发布到maven中央仓库会要求我们在上传jar到同时,必须同步发布对应到Javadoc、source、asc(利用gpg生成到校验),所以需要在maven中添加以下构建插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<encoding>utf-8</encoding>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<!-- 生成java source.jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<show>private</show>
<nohelp>true</nohelp>
<charset>UTF-8</charset>
<encoding>UTF-8</encoding>
<docencoding>UTF-8</docencoding>
<!-- TODO 临时解决不规范的javadoc生成报错,后面要规范化后把这行去掉 -->
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
6. 打包发布jar到中央仓库
执行以下命令进行发布
(如果 pom.xml 中 autoReleaseAfterClose 的值为true,则脚本会自动完成在平台上close、release的操作,至此你将成功发布了,否则我们继续查看第3步)
mvn clean package deploy -DskipTests
发版成功会组件将存储在单独的临时存储库中(stagingRepositories),该存储库对您的项目成员是私有的。为了发布这些组件,您必须“发布”它们。如果您在存储库中检查时发现任何问题,您也可以删除暂存存储库。这允许您在修复发现的任何问题后重新运行部署,并避免将这些组件发布到发布存储库中,然后再依次发布到中央存储库中。
通常,此过程是手动完成的,但也可以从命令行触发操作。
登录 OSSRH
您需要登录到 https://s01.oss.sonatype.org/上的 OSSRH 才能访问和使用您的暂存存储库。将您帐户中的用户名和密码用于 OSSRH 的 JIRA 问题跟踪系统以及OSSRH 用户界面右上角的登录链接。
关闭并删除或释放您的暂存存储库
部署后,存储库将处于打开状态。您可以使用Contents选项卡评估存储库中已部署的组件。如果您认为一切都是正确的,可以按列表上方的关闭按钮。这将触发针对 需求的组件评估。
如果您的组件不符合要求,则关闭将失败。如果发生这种情况,您可以按Drop并且暂存存储库将被删除。这使您可以更正组件和部署过程的任何问题并重新运行部署。通过选择,可以在列表下方的“活动”选项卡中获得详细信息。按各个步骤以获取更多详细信息。
成功关闭暂存存储库后,您可以按Release按钮将其释放。这会将组件移动到 OSSRH 的发布存储库中,并在其中同步到中央存储库。
参考:https://central.sonatype.org/publish/release/#locate-and-examine-your-staging-repository
- 1.点击左侧菜单Staging Repositories
- 2.使用搜索功能搜索当前项目
- 3.找到之后先close,在release
release成功后,点击refresh,此时Staging Repositories中就不存在此缓存项目了,这时,在oss全局搜索中搜索项目,则会找到已发布的jar
然后进行最后一步,就是回到issue中,添加评论,告诉他们我们已经发布了项目,等待他们审核,大概需要2个小时左右就好了,只有第一次发布的时候需要审核,以后更新版本时,直接点在oss发布,10分钟左右就可以搜索到新的版本。
第一次再下午或者晚上上架的会会比较迟,因为审核人员下班了o(╥﹏╥)o,大概第二天早上才会通过
再pom.xml 里面配置自动close,release,就不需要我们去手动操作了
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
7. 验证
使用 Sonatype 的账号密码登录 https://s01.oss.sonatype.org/
老版本的登录地址为 https://oss.sonatype.org/#welcome,这个是登录不成功的。
mvnrepository
https://mvnrepository.com/artifact/io.github.admin4j/http
search.maven.org
https://search.maven.org/artifact/io.github.admin4j/http
发布 Snapshot 版本的坑
当您的版本以-SNAPSHOT结尾时,将执行快照部署。
官网上有句话
SNAPSHOT versions are not synchronized to the Central Repository. If you wish your users to consume your SNAPSHOT versions, they would need to add the snapshot repository to their Nexus Repository Manager, settings.xml, or pom.xml. Successfully deployed SNAPSHOT versions will be found in https://s01.oss.sonatype.org/content/repositories/snapshots/
意思是:SNAPSHOT 不会同步到Central Repository 中心仓库,用户使用不了。如果要使用需要加配置
<repositories>
<repository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
参考
官方最强发布文档 https://central.sonatype.org/publish/publish-maven/