Maven - 发布JAR包到Maven远程中央仓库
声明:经过下面一系列操作之后,以后想发布新版本,只要修改好要升级的版本,然后在 Maven的 Lifecycle 里双击 deploy 即可~
前言
自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然是发布到maven的中央仓库了,不过要说这个发布过程,还真是比较复杂,本文就来详细说下如何发布jar包到maven中央仓库。
注意事项
1、工单管理:https://issues.sonatype.org/secure/Dashboard.jspa
说明:注册账号、创建和管理issue,Jar包的发布是以解决issue的方式起步的。这里的用户名与密码是非常重要的,后面会用到,一定要保存好。
2、构件仓库:https://oss.sonatype.org/#welcome
说明:算是正式发布前的一个过段仓库,使用maven提交后的jar包先到这个库中。
3、镜像仓库:http://search.maven.org
说明:最终成功发布的jar可以在这里搜到。
一、创建工单
在上述的工单管理
的地址中进行创建,如果没有账号,需要先注册一个,记住用户名密码,后边要配置到setting.xml
中。
Create Issue 填写内容说明:
===Step 1===
Project:Community Support - Open Source Project Repository Hosting
Issue Type:New Project===Step 2===
Summary:JAR包名称,如:requestjson
Group Id:你懂得,不用多说,如com.luxsuen
Project URL:项目站点,如:https://github.com/LuxSun/requestjson
SCM url:项目源码仓库,如:https://github.com/LuxSun/requestjson.git
其他内容不用填写,创建Issue后需要等待一小段时间,Sonatype的工作人员审核处理,速度还是很快的,一般一个工作日以内,当Issue的Status变为RESOLVED后,就可以进行下一步操作了,否则,就等待…
到这里,需要跟客服唠嗑一下~(以前这一步审核很简单,跟客服说是你的即可,现在开始要提供证明)
1、如果是用Github,就无需注册域名,直接根据客服提示证明一下即可(新手推荐)。
2、如果是用自己的域名,就需要根据客服的提示配置下DNS。
Ps:无论以上是哪种情况,最后只要呈现如下图所示,即代表成功!
二、配置Maven(pom.xml)
接下来就是重头戏了,pom.xml是一个maven项目的重点配置,一个项目的所有配置都可以由这个文件来描述,文件中的所有配置都有默认值,也就是说所有的配置都是可选配置,但是为了把构件发布到中央仓库,我们必须配置一些关键信息,否则再发布时是不会通过了。
在工程的pom.xml文件中,引入Sonatype官方的一个通用配置oss-parent
,这样做的好处是很多pom.xml的发布配置不需要自己配置了:
<parent><groupId>org.sonatype.oss</groupId><artifactId>oss-parent</artifactId><version>7</version>
</parent>
并增加Licenses、SCM、Developers信息:
<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><developers><developer><name>Lux Sun</name><email>28554482@qq.com</email><organization>Lux Sun</organization><url>https://github.com/LuxSun</url></developer>
</developers><scm><url>https://github.com/LuxSun/requestjson</url><connection>https://github.com/LuxSun/requestjson.git</connection>
</scm>
修改maven配置文件setting.xml,在servers中增加server配置。
<servers><server><id>sonatype-nexus-snapshots</id><username>Sonatype 账号</username><password>Sonatype 密码</password></server><server><id>sonatype-nexus-staging</id><username>Sonatype 账号</username><password>Sonatype 密码</password></server>
</servers>
根据官方指南,这里需要4个插件,
- maven-source-plugin 用来生成Source Jar文件
- maven-javadoc-plugin 用来生成 javadoc 文档
- maven-gpg-plugin 用来对工程文件进行自动签名
- nexus-staging-maven-plugin 用来将工程发布到中央仓库
另外注意生成javadoc文档时需要指定关闭doclint,不然可能因为使用了不规范的javadoc注解而导致失败,完整配置如下。
完整版
<?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><groupId>com.luxsuen</groupId><artifactId>requestjson</artifactId><version>1.0.1</version><packaging>jar</packaging><name>requestjson</name><description>RequestJson</description><url>https://github.com/LuxSun/requestjson</url><properties><spring.version>4.3.2.RELEASE</spring.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.encoding>UTF-8</maven.compiler.encoding></properties><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><developers><developer><name>Lux Sun</name><email>28554482@qq.com</email><organization>Lux Sun</organization><url>https://github.com/LuxSun</url></developer></developers><scm><url>https://github.com/LuxSun/requestjson</url><connection>https://github.com/LuxSun/requestjson.git</connection></scm><distributionManagement><snapshotRepository><id>ossrh</id><name>oss Snapshots Repository</name><url>https://oss.sonatype.org/content/repositories/snapshots</url></snapshotRepository><repository><id>ossrh</id><name>oss Staging Repository</name><url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url></repository></distributionManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><executions><execution><id>default-jar</id><phase>package</phase><goals><goal>jar</goal></goals></execution></executions><configuration><excludes><exclude>**/spring/</exclude><exclude>**/com/luxsuen/requestjson/entity/</exclude><exclude>**/com/luxsuen/requestjson/web/</exclude><exclude>**/META-INF/*.kotlin_module</exclude></excludes></configuration></plugin></plugins></build><profiles><profile><id>release</id><build><plugins><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><configuration><excludes><exclude>**/spring/</exclude><exclude>**/com/luxsuen/requestjson/entity/</exclude><exclude>**/com/luxsuen/requestjson/web/</exclude><exclude>**/META-INF/*.kotlin_module</exclude></excludes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>2.9.1</version><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals></execution></executions><configuration><excludePackageNames>com.luxsuen.requestjson.entity:com.luxsuen.requestjson.web</excludePackageNames></configuration></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.sonatype.plugins</groupId><artifactId>nexus-staging-maven-plugin</artifactId><version>1.6.7</version><extensions>true</extensions><configuration><serverId>ossrh</serverId><nexusUrl>https://oss.sonatype.org/</nexusUrl><autoReleaseAfterClose>true</autoReleaseAfterClose></configuration></plugin></plugins></build></profile></profiles>
</project>
注意1:以上 pom.xml 必须包括:name、description、url、licenses、developers、scm 等基本信息,此外,使用了 Maven 的 profile 功能,只有在 release 的时候,创建源码包、创建文档包、使用 GPG 进行数字签名。此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。
注意2:这里在 nexus-staging-maven-plugin 插件里开启了自动 Release。也可以关掉,然后登录构件仓库 https://oss.sonatype.org 手动去 close 然后 relseae。
三、配置gpg-key
1、可视化配置
Windows的话先到 https://gpg4win.org/download.html 下载最新的版本,直接安装即可打开即可。
1.1、新建密钥对(OpenPGP类型)
这里需要填入名字和电子邮件,然后注意可以在高级设置那里将有效期一栏的小勾取消掉,即有效期无限,如下。
1.2、确认信息并输入密码
1.3、选择将公钥上传到目录服务
注意:如果这里不点的话后面分发后将无法在服务器找到对应公钥。
1.4、右键选择生成的证书在服务器上发布
1.5、根据密钥ID在服务器上查找公钥
最终必须保证这一步成功!如下。
Ps:注意:这里有个bug,如果生成的密钥ID的第一个字符是数字0的话,在下面使用maven-gpg插件的时候可能会被自动去掉导致密钥找不到,所以保险起见遇到这种情况就重新生成证书。
2、命令行配置
Ps:Windows系统使用“gpg”命令开头,而Mac系统使用“gpg2”命令开头。
如果是使用的windows,可以下载gpg4win,地址:https://www.gpg4win.org/download.html
,安装后在命令行中执行 gpg --gen-key
生成,过程中需要填写名字、邮箱等,其他步骤可以使用默认值,不过有个叫:Passphase的参数需要记住,这个相当于是是密钥的密码,下一步发布过程中进行签名操作的时候会用到。
建议大家下载 Gpg4win-Vanilla 版本,因为它仅包括 GnuPG,这个工具才是我们所需要的。
安装 GPG 软件后,打开命令行窗口,依次做以下操作:
2.1、查看是否安装成功
gpg --version
能够显示 GPG 的版本信息,说明安装成功了。
2.2、生成密钥对
gpg --gen-key
此时需要输入姓名、邮箱等字段,其它字段可使用默认值,此外,还需要输入一个 Passphase,相当于一个密钥库的密码,一定不要忘了,也不要告诉别人,最好记下来,因为后面会用到。
2.3、查看公钥
gpg --list-keys
输出如下信息(新版本可能格式会有点区别,不用担心,是正常的):
C:/Users/huangyong/AppData/Roaming/gnupg/pubring.gpg
----------------------------------------------------
pub 2048R/82DC852E 2014-04-24
uid hy_think <hy_think@163.com>
sub 2048R/3ACA39AF 2014-04-24
可见这里的公钥的 ID 是:82DC852E,很明显是一个 16 进制的数字,马上就会用到。
2.4、将公钥发布到 PGP 密钥服务器(后面还需要操作此步骤)
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 82DC852E
此后,可使用本地的私钥来对上传构件进行数字签名,而下载该构件的用户可通过上传的公钥来验证签名,也就是说,大家可以验证这个构件是否由本人上传的,因为有可能该构件被坏人给篡改了。
2.5、查询公钥是否发布成功
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 82DC852E
实际上就是从 key server 上通过公钥 ID 来接收公钥,此外,也可以到 sks-keyservers.net 上通过公钥 ID 去查询。
四、上传构件到 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-06E:\98_code\workSpace\marathon-client>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 824B4D7A
gpg: sending key 824B4D7A to hkp server keyserver.ubuntu.comE:\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 的插件。待更新...
Maven - 发布JAR包到Maven远程中央仓库相关推荐
- Maven发布jar包全过程(详细)
Maven发布jar包全过程 1. 基本概念 1.1 sonatype jira 1.2 sonatype nexus 2. 发布过程 2.1 注册Sonatype JIRA账号 2.2 登录Sona ...
- 记一次Maven发布Jar包中文乱码解决方法
Maven deploy 乱码 今天使用Maven发布Jar包时,发布功能都是正常的也成功上传到了仓库,就是项目跑越来后出中文中现了乱码: {"code": "SUCCE ...
- 发布Jar包到Maven中央仓库(为开发开源中间件做准备)
微信公众号:bugstack虫洞栈 沉淀.分享.成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获.目前已完成的专题有:Netty4.x实战专题案例.用Java实现JVM ...
- Maven发布jar包到Nexus私库
Nexus2可以通过管理界面来上传jar包到私库中,而最新的Nexus3却找不到了上传界面,只能通过以下方式来发布到私库. 发布第三方jar包 这种情况是maven远程仓库没有,本地有的第三方jar包 ...
- 如何发布Jar包到Maven中央仓库
https://www.iteblog.com/archives/1807.html 转载于:https://www.cnblogs.com/longshiyVip/p/6858844.html
- Maven拉取私服Jar包和发布jar包到maven私服
<url>http://192.168.1.15:8081/repository/maven-public/</url> 将maven的setting文件中的仓库路径替换成自己 ...
- maven发布jar包到私服以及从私服下载jar包的操作
思路: 1.修改maven的setting.xml文件 2.pom.xm文件中添加配置 3.注意id要一致 详细如下: 1.修改maven的setting.xml文件,找到里面的 servers 标签 ...
- 发布/上传Jar包到Maven中央仓库 - 史上最详细
发布 Jar 包到 Maven 中央仓库 在项目开发过程中,我们常常会使用 Maven / Gradle 从仓库拉取开源的第三方 jar 包,可能是私有仓库,可能是 Maven 中央仓库,也可能是第三 ...
- 发布个人项目jar包到maven中央仓库详解
发布个人项目jar包到maven中央仓库详解 1.在sonatype提交发布工单(Issue) sonatype是由社区支持的开源项目托管服务(Open Source Project Reposito ...
最新文章
- linux pip 找不到python
- 新思路!商汤开源利用无标注数据大幅提高精度的人脸识别算法
- 当linkedin connection达到1500的时候的感受
- 工作三年左右的Java程序员跟大家谈谈从业心得
- 春运首日山东烟台海上安全巡航
- 使用java开发简单的mis系统所需的技术
- 递归转化成非递归过程_8086微处理器中的递归和重入过程
- 我的第一个C++程序,还像个C++c程序的样子吧
- 华南理工大学2016年数学分析高等代数考研试题参考解答
- zabbix 监控项自动发现过滤_zabbix怎么使用自动发现添加新监控项
- 网站文章内容发现重复率过高的解决办法
- Ubuntu下pycharm设定任务栏图标后打开出现问号图标
- Android开发笔记(一百七十三)给安装包APK文件瘦身
- Robcup2D足球学习记录【2020.01.30】
- 电商设计师(美工)必备的素材网站!
- SoviChart数据可视化:条形图(Bar chart)
- Jenkins + 云效 前后端项目自动化部署
- PAT-Day1-挖掘机技术哪家强
- 2021.12.10 vue 路由 (13)
- 北大计算机楼口语考试,(转自未名)北大考点最全攻略及国外考试经验。。。...
热门文章
- linux quota---mount
- 常用API、String、StringBuilder、集合和客户信息管理系统
- java 0xff是什么意思_Java中为何与0xff进行与运算
- JS的100道经典面试题(一)只看这四篇就够了,收藏起来以后偷偷看
- Haproxy 透传IP配置方法及测试
- SVN的安装及配置(客户端+服务端)
- Windows2008关机时蓝屏而后重启的解决
- HILLSTONE sg6000 g5150 怎么恢复出厂设置
- 【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于阿里云、小程序、Arduino的WS2812灯控系统
- Java线程 构造函数在那个线程中调用