目录
预备知识
一、sonatype.org添加项目
二、发布snapshots版本
三、发布release版本
解决问题:
自己开发了开源的项目,想上传到maven中央仓库,这样方便的大家在外网使用以及升级。
预备知识
(1)maven中央仓库(Maven Central),由sonatype.org维护。
snapshots版本不需要Staging审核,在https://oss.sonatype.org可以查到。
release版本需要通过Staging审核,最终才可以在https://repo1.maven.org/maven2/查到。
(2)gpg签名
gpg是加密工具,如果要发布自己的jar到中央仓库Release Repositories ,则需要gpg签名,证明此包的完整性。
加密解密是防止内容泄漏,签名验签是防止内容被串改(确保完整性)。
这里只使用rsa签名验签功能。
(3)release版本和snapshots版本区别
snapshots版本:快照版本即开发版本,版本号以-SNAPSHOT结尾,开发人员同一个版本多次发布,使用者可以自动load最新版本。
release版本:发布版本即稳定版本,开发人员同一个版本多次发布,使用者不能自动load最新版本。
如:release版本1.0.0发现有bug,则需要改为1.0.1-SNAPSHOT修复代码。
一、sonatype.org添加项目
1、sonatype.org上创建注册账号
https://issues.sonatype.org/secure/Dashboard.jspa
2、创建issue
项目:Community Support - Open Source Project Repository Hosting (OSSRH)
问题类型:New Project
摘要:简单介绍自己的项目
GroupId:对应github或者gitee上个人域倒置,如:com.gitee.flyzing
ProjectUrl:对应github或gitee上仓库地址,如:https://gitee.com/flyzing/mybatis-genl
SCM url:对应github或gitee上仓库地址+.git,如:https://gitee.com/flyzing/mybatis-genl.git
其他选项不填。
3、sonatype人工审核
初始状态为Open,如果通过审核为状态改为Resolved(已解决),
如果审核不通过,状态变为Waiting for Response,审核人员会给出“评论”。
坑1、添加issue时,填入的groupid,必须是一个可访问且属于自己的域名。
于是,将groupid改为自己的gitee或github地址,如:com.gitee.flyzing
坑2,添加issue时,填入的groupid,必须是一个可访问且属于自己的域名,要求你在域中添加OSSRH-xxxxx证明。
于是,在仓库中添加OSSRH-xxxxx空仓库,链接可访问即可。
通过审核,会收到评论和邮件。
二、发布snapshots版本
1、项目pom.xml添加配置
<!--开发者的信息-->
<developers>
<developer>
<name>flyzing</name>
<email>flyzing@126.com</email>
</developer>
</developers>
<!--项目的版本管理地址-->
<scm>
<url>https://gitee.com/flyzing/mybatis-genl</url>
</scm>
<!--发布的地址-->
<distributionManagement>
<snapshotRepository>
<id>snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>release</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
</repository>
</distributionManagement>
其中url对应sonatype.org人工审核通过后评论或邮件中提供的snapshots和release地址。
其中id对应maven中的setting.xml中配置。
2、maven setting.xml添加配置
<servers>
<server>
<id>snapshots</id>
<username>sonatype.org用户名</username>
<password>sonatype.org密码</password>
</server>
<server>
<id>release</id>
<username>sonatype.org用户名</username>
<password>sonatype.org密码</password>
</server>
</servers>
坑3,这里配置的setting.xml是指home中.m2目录的文件,如:vim ~/.m2/settings.xml
如果配置的是maven项目中的setting.xml,如:vim ~/DEV/apache-maven-3.5.0/conf/settings.xml,那么在deploy时将读取不到配置。
报错Return code is: 401, ReasonPhrase: Unauthorized的两个原因,即是server中username和password错误 或 根本读取不到配置。
因此可以先配置好后复制到.m2中,同时使用mvn help:effective-settings查看生效的setting.xml内容。
3、命令行发布
mvn clean deploy
可以在https://oss.sonatype.org/查看发布结果。
三、发布release版本
release版本发布比snapshots版本发布多了Staging环节。
因此需要在Snapshots配置基础上,添加额外配置通过审核,具体如下:
1、pom.xml添加审核时必要的项目信息
<modelVersion>4.0.0</modelVersion>
<groupId>com.gitee.flyzing</groupId>
<artifactId>mybatis-genl</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<!-- 如果name、url、description、licenses为空,release到中央库报错 -->
<name>mybatis-genl</name>
<url>https://gitee.com/flyzing/mybatis-genl</url>
<description>mybatis-genl</description>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
坑4、groupId必须和在sonatype.org申请的相对应,不一致deploy时报错:ReasonPhrase: Forbidden。
我之前在sonatype.org申请过com.flyzing失败,后改为com.flyzing.gitee申请通过,然而pom.xml里忘记改了,所以这里报错。
坑5、其中name、url、description、licenses不能为空,发布release版本时最终审核需要。
2、生成gpg签名
(1)下载并安装gpg
brew install gpg
坑6、brew不可用
==> `brew cleanup` has not been run in 30 days, running now...
Error: Permission denied ......
修改权限,重新安装
sudo chown -R $(whoami):admin /usr/local/* && sudo chmod -R g+rwx /usr/local/*
brew reinstall gpg
(2)生成gpg key
gpg --full-generate-key
请选择您要使用的密钥类型:
(1) RSA 和 RSA (默认)
(2) DSA 和 Elgamal
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(14) Existing key from card
您的选择是? 4
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072)
请求的密钥长度是 3072 位
请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
这些内容正确吗? (y/N) y
......
请注意这个密钥不能用于加密。您可能想要使用“--edit-key”命令来
生成一个用于此用途的子密钥。
pub rsa3072 2021-01-18 [SC]
XXXXXXXXX公钥在此,请记住后面有用XXXXXXXXXX
uid flyzing (for mybatis-genl) <flyzing@126.com>
(3)将公钥上传到公钥服务器
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys XXXXXXXXX公钥在此,请记住后面有用XXXXXXXXXX
坑7、pool.sks-keyservers.net访问不了,报错:
gpg: 发送至公钥服务器失败:No route to host
gpg: 发送至公钥服务器失败:No route to host
先导出
gpg --export flyzing@126.com > ~/Downloads/my_key.pub
然后在https://keys.openpgp.org/upload手动上传
3、pom.xml添加插件配置,生成source,doc,关联gpg签名
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<!-- Source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<!-- jdk1.8要加上,1.7要去掉,否则会报错 -->
<additionalJOptions>
<additionalJOption>-Xdoclint:none</additionalJOption>
</additionalJOptions>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- GPG -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
4、命令行发布
mvn clean deploy -Prelease
坑8、maven-javadoc-plugin生成文档报错,注解强校验。
报错:未知标记 Date,@return 没有说明等,
pom.xml中maven-javadoc-plugin添加:
<configuration>
<!-- jdk1.8要加上,1.7要去掉,否则会报错 -->
<additionalJOptions>
<additionalJOption>-Xdoclint:none</additionalJOption>
</additionalJOptions>
</configuration>
坑9、gpg 终端无法弹出密码输入页面。
报错:gpg: signing failed: Inappropriate ioctl for device
export GPG_TTY=$(tty)
5、审核发布
在https://oss.sonatype.org先登录自己账号,然后Staging Repositories中选中刚刚发布的项目。(我的项目已经release这里看不到了)
初始状态为Open,点击Close,提交系统自动审核,如果审核不通过,下面会显示需要修改的信息,修改完后再次Close。
通过审核后,状态改为Closed,点击Release完成最后的发布。
6、通知sonatype.org审核人员已经发布成功,让其同步到正式仓库。
在之前的邮件或评论上也有提到:
回到sonatype.org项目地址下添加评论:Released successfully
审核人员给与回复,大意是2小时后就可以在中央仓库搜索到了。
实际3小时后,登录https://search.maven.org查看结果:
最后在sonatype.org项目地址中关闭问题,Over。