背景
和朋友一起维护的开源组织(我就是打个辅助,逃~),其中有一个系列的项目,这些项目统一通过 base 项目的 pom 文件管理这个系列项目依赖的第三方 jar,其他一些辅助项目(如:tools)项目主要是一些常用工具方法的封装,为了能让我们在不同机器,不同地点能够无缝切换,更重要的让使用的伙伴能以最简便的方式运行(避免不必要的配置),我们需要把通用的东西托管起来,那么就需要将这些配置依赖或辅助 jar 托管到 Maven中央仓库,话不多说,就跟着我的步骤来看看如何将 jar 发布到 Maven中央仓库
准备
这里以 Mac 系统演示
Sonatype
账号注册
Sonatype 账号注册地址:https://issues.sonatype.org/secure/Signup!default.jspa
记录好你的账号和密码,后续会用到
创建 issue
创建 issue 地址:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
填写信息时,只填写必填项即可
Summary
:简单的项目介绍,填写一下
Group Id
:项目ID,用来定位应用 jar 的坐标,可参考官方说明
Project URL
:项目主页地址
SCM url
:Git仓库地址
注意:
Group Id
无自己的域名:可以使用 Github,比如我的 GitHub 用户名是 BladeCode(也可以用你的组织名,如这里:twodragonlake),那么这里的Group Id应该填写 com.github.BladeCode,也可以使用 io.github.BladeCode
有自己的域名:按照要求添加一条 TXT 的 DNS 解析,用来验证你的 Group Id
可参考:OSSRH-45597
验证 Group Id
根据你是否有自己的域名,有不同的方式来验证,上面的创建 issue 的注意中已经说明了,这里不啰嗦了,直接看下图
GPG
Windows:Gpg4win
macOS:gpg
安装
macOS 为例
1 2 3 4 brew install gpg gpg --version
生成秘钥对
这里用于生成秘钥的用户名和邮箱,可以和你的 Sonatype
账号不一样,记录密码
,在部署时需要用到
上传秘钥
1 2 3 4 gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys <密钥ID> gpg --keyserver hkp://pool.sks-keyservers.net:11371 --recv-keys <密钥ID>
上传到其他服务器,命令同上,更换地址即可
hkp://keyserver.ubuntu.com:11371
hkp://keys.gnupg.net:11371
如果你忘记了你刚刚生成的秘钥,可以使用下面的命令来查看本地生成的所有秘钥
配置
maven 配置
查看路径
macOS 可以使用 IDEA 查看 maven 的路径,/usr/local/Cellar/maven/3.6.0/libexec/conf
修改 settings.xml
文件
在 <servers>
标签内,添加如下配置 1 2 3 4 5 <server > <id > oss</id > <username > 你注册的Sonatype账号</username > <password > 密码</password > </server >
pom 配置
配置你需要上传项目的 pom
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 <parent > <groupId > org.sonatype.oss</groupId > <artifactId > oss-parent</artifactId > <version > 7</version > </parent > <name > tdl-base</name > <description > TwoDragonLake base pom</description > <url > https://github.com/TwoDragonLake/tdl-base</url > <licenses > <license > <name > Apache License, Version 2.0</name > <url > http://www.apache.org/licenses/LICENSE-2.0</url > </license > </licenses > <developers > <developer > <name > Jerry xu</name > <email > incoder.xu@gmail.com</email > </developer > </developers > <scm > <tag > master</tag > <url > https://github.com/TwoDragonLake/tdl-base.git</url > <connection > scm:git:https://github.com/TwoDragonLake/tdl-base.git</connection > <developerConnection > scm:git:https://github.com/TwoDragonLake/tdl-base.git</developerConnection > </scm > <profiles > <profile > <id > release</id > <build > <pluginManagement > <plugins > <plugin > <artifactId > maven-clean-plugin</artifactId > <version > 3.0.0</version > </plugin > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-source-plugin</artifactId > <version > 3.0.1</version > <executions > <execution > <phase > package</phase > <goals > <goal > jar-no-fork</goal > </goals > </execution > </executions > </plugin > <plugin > <artifactId > maven-compiler-plugin</artifactId > <version > 3.7.0</version > </plugin > <plugin > <artifactId > maven-surefire-plugin</artifactId > <version > 2.20.1</version > </plugin > <plugin > <artifactId > maven-jar-plugin</artifactId > <version > 3.0.2</version > </plugin > <plugin > <artifactId > maven-install-plugin</artifactId > <version > 2.5.2</version > </plugin > <plugin > <artifactId > maven-deploy-plugin</artifactId > <version > 2.8.2</version > </plugin > </plugins > </pluginManagement > <plugins > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-compiler-plugin</artifactId > <configuration > <source > 8</source > <target > 8</target > </configuration > </plugin > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-source-plugin</artifactId > <executions > <execution > <phase > package</phase > <goals > <goal > jar-no-fork</goal > </goals > </execution > </executions > </plugin > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-javadoc-plugin</artifactId > <version > 2.9.1</version > <executions > <execution > <phase > package</phase > <goals > <goal > jar</goal > </goals > </execution > </executions > </plugin > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-gpg-plugin</artifactId > <version > 1.6</version > <executions > <execution > <phase > verify</phase > <goals > <goal > sign</goal > </goals > </execution > </executions > </plugin > </plugins > </build > <distributionManagement > <snapshotRepository > <id > oss</id > <url > https://oss.sonatype.org/content/repositories/snapshots/</url > </snapshotRepository > <repository > <id > oss</id > <url > https://oss.sonatype.org/service/local/staging/deploy/maven2/</url > </repository > </distributionManagement > </profile > </profiles >
编译并部署
1 mvn clean deploy -P release -Dmaven.test.skip=true
然后在命令行的弹出中输入使用 gpg 命令生成秘钥时输入的密码,如果在命令行中没有弹框提示,那么可以在终端中输入export GPG_TTY=$(tty)
命令,再次执行部署命令,部署完成参考下图提示
发布
编译构建验签
部署成功后,使用Sonatype
登录 https://oss.sonatype.org 网站,进行发布,在Build Promotion
中选择Staging Repositories
,然后选择对应你的groud id
的Repository
,进行 close,这里的Close
其实就是进行自动构建,进行验证
参看是自动化运行过程否有错误,正确如下截图没有错误提示,如果有错误提示,就按照提示内容进行处理
发布
构建成功无错误,后就可以发布了,其实发布和部署是一样的操作,只不过部署是进行Close
,而发布是Release
操作,此时会提示你发布成功后会删除Staging Repositories
的 Repository
记录
查看
打开你的https://issues.sonatype.org ,登录并查看,你的 issues 下,提示你,已经发布成功,稍后可以在https://search.maven.org 中搜索到
搜索结果,可以查看到我们发布的包
异常
IDEA 中 not found
项目中引入的 jar,IDEA 中提示无法找到包,可以打开 IDEA 的 Preferences 中进行同步
本地编译错误
无提示框提示输入密码
解决方法:export GPG_TTY=$(tty)
命令,重新编译
无法连接sonatype
解决方法:查看settings.xml
文件中 <server>
标签中配置的 id
是否与项目pom
文件的<distributionManagement>
标签下的 id
是否一致
sonatype 构建错误
查看构建过程中错误提示,我这里是应为无法验证签名,因此我将提示中的服务器地址,全部都再发布gpg
的秘钥,注意地址开头是 hkp
附录
官方
OSSRH Guide
发布要求、规范
PGP签名使用
发布项目文档
其他
发布 Maven 构件到中央仓库
发布构件到Maven中央仓库
如何发布Jar包到Maven Central Repository