Maven – 发布JAR包到Maven远程中央仓库(五)

作者: adm 分类: java 发布时间: 2022-10-26

四、上传构件到 OSS 中
这步就简单了,就是一套命令:
mvn clean deploy -P sonatype-oss-release -Darguments=”gpg.passphrase=密钥密码”
如果使用eclipse的mvn插件发布的话,配置如下(IDEA类似):

如果发布成功,就可以到构件仓库中查看了。
或者
先通过 cmd 进入到项目的这个目录下。

再执行下面命令。
mvn clean deploy -P release
当执行以上 Maven 命令时,会自动弹出一个对话框,需要输入上面提到的 Passphase,它就是通过 GPG 密钥对的密码,只有自己才知道。随后会看到大量的 upload 信息,而且速度比较慢,经常会 timeout,需要反复尝试。
注意:此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,下面才是真正的发布。
五、在 OSS 中发布构件
进入https://oss.sonatype.org/#stagingRepositories查看发布好的构件,点击左侧的Staging Repositories,一般最后一个就是刚刚发布的jar了,此时的构件状态为open。
打开命令行窗口,查看gpg key并上传到第三方的key验证库:
E:\98_code\workSpace\marathon-client>gpg –list-keys
C:/Users/VF/AppData/Roaming/gnupg/pubring.gpg
———————————————
pub 2048R/824B4D7A 2016-01-06
uid [ultimate] cloudnil
sub 2048R/7A10AD69 2016-01-06

E:\98_code\workSpace\marathon-client>gpg –keyserver hkp://keyserver.ubuntu.com:11371 –send-keys 824B4D7A
gpg: sending key 824B4D7A to hkp server keyserver.ubuntu.com

E:\98_code\workSpace\marathon-client>
回到 https://oss.sonatype.org/#stagingRepositories,选中刚才发布的构件,并点击上方的close–>Confirm,在下边的Activity选项卡中查看状态,当状态变成closed后,执行Release–>Confirm,并在下边的Activity选项卡中查看状态,成功后构件自动删除。
需要在曾经创建的 Issue 下面回复一条“构件已成功发布”的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后会关闭该 Issue。
一小段时间(约1-2个小时)后即可同步到https://search.maven.org中央仓库(Maven中央仓库可能需要24-48小时:https://mvnrepository.com)。

Ps:注意这里有个大坑,之前很多教程都会把这个步骤提前到最开始(我不是说生成密钥这个环节,这个密钥生成环节的确是一开始就可以弄了的),但下面这句解析需要到这一步再开始搞,之前一直在https://oss.sonatype.org/#stagingRepositories这里审核一直失败,大坑呀~
最后,想说一句:第一次都是很痛的,以后就舒服了。没错,只有第一次发布才如此痛苦,以后 deploy 的构件会自动部发布到中央仓库,无需再这样折腾了。(附加:成功效果图)

附:
在编码过程中,有些通用的代码模块,有时候我们不想通过复制拷贝来粗暴地复用,因为这样不仅体现不了变化,也不利于统一管理。这里我们使用maven deploy的方式,将通用的模块打成jar包,发布到nexus,让其他的项目来引用,以更简洁高效的方式来实现复用和管理。
第一:maven的settings.xml文件中设置标签

my-deploy-release
admin admin123


my-deploy-snapshot
admin admin123

此处设置的用户名和密码都是nexus的登陆配置。

第二:在项目的pom.xml文件中设置


my-deploy-release
http://192.168.1.123:8081/nexus/content/repositories/releases/


my-deploy-snapshot
http://192.168.1.123:8081/nexus/content/repositories/snapshots/


在此,url都是nexus相应仓库的链接地址,这一步做完之后,已经完成了发布所需要的基本配置。【试试命令:mvn deploy】
注意:中的要和一致,maven在发布时,会根据此id来查找相应的用户名密码进行登录验证并上传文件。
第三:发布的灵活性配置
maven会判断版本后面是否带了-SNAPSHOT,如果带了就发布到snapshots仓库,否则发布到release仓库。这里我们可以在pom.xml文件中,设置。
com.test
my-test jar ${project.release.version}

1.8 1.0-SNAPSHOT product 1.0 说明:通过占位符${project.release.version}来控制需要发布的版本,用命令mvn deploy -P product,发布my-test的1.0版本到releases库。如果使用命令mvn deploy,则默认使用 1.0-SNAPSHOT版本号,将发布my-test的1.0-SNAPSHOT版本到snapshots库。
第四:发布时遇到的一些问题
部署到snapshot仓库时,jar包会带上时间戳,这没关系,maven会自动取相应版本最新的jar包;
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project my-test: Failed to deploy artifacts: Could not transfer artifact…from/to release…
部署到release仓库时,相同版本的jar包不能提交。
原因:因为release的部署策略是【disable redeploy】,不允许覆盖更新组件。
解决办法:修改一下版本号,再提交即可。之前其实还可以通过人工客服聊天帮忙删除不想要的Jar包,但是现在不行了,只能通过上传新版本,所以有些童鞋想做测试的需要注意这一点。
打包指定的文件/文件夹在代码中也有体现(含:doc、sources、class)。
Maven deploy 时,为什么没有生成对应的 javadoc 和 sources (前提已经有插件部署好)?

1. Ps:也许是图上的 id = “release” 没有打勾造成没有执行 javadoc 和 sources 的插件。
2. 待更新…

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!