四、上传构件到 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 <cloudnil@126.com> 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文件中设置<server>标签
<server> <id>my-deploy-release</id> <username>admin</username> <password>admin123</password> </server> <server> <id>my-deploy-snapshot</id> <username>admin</username> <password>admin123</password> </server>
此处设置的用户名和密码都是nexus的登陆配置。
第二:在项目的pom.xml文件中设置
<distributionManagement> <repository> <id>my-deploy-release</id> <url>http://192.168.1.123:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>my-deploy-snapshot</id> <url>http://192.168.1.123:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>
在此,url都是nexus相应仓库的链接地址,这一步做完之后,已经完成了发布所需要的基本配置。【试试命令:mvn deploy】
注意:<server>中的<id>要和<repository>、<snapshotRepository>的<id>一致,maven在发布时,会根据此id来查找相应的用户名密码进行登录验证并上传文件。
第三:发布的灵活性配置
maven会判断版本后面是否带了-SNAPSHOT,如果带了就发布到snapshots仓库,否则发布到release仓库。这里我们可以在pom.xml文件中,设置。
<groupId>com.test</groupId> <artifactId>my-test</artifactId> <packaging>jar</packaging> <version>${project.release.version}</version> <properties> <java.version>1.8</java.version> <project.release.version>1.0-SNAPSHOT</project.release.version> </properties> <profiles> <profile> <id>product</id> <properties> <project.release.version>1.0</project.release.version> </properties> </profile> </profiles>
说明:通过占位符${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 (前提已经有插件部署好)?
- Ps:也许是图上的 id = “release” 没有打勾造成没有执行 javadoc 和 sources 的插件。
- 待更新...