将maven项目发布到central repository
前言
本文发表日期:2019年12月30日
近期把自己开发的一个工具包发布到了central仓库,记录一下提交流程。
流程
1. 完善pom.xml
1.1. 完善项目信息
通常来说我们项目的pom.xml不会包含完整信息,但是如果要申请发布到central的话就有要求了,通常选填的name
,description
,url
,licences
,developers
,scm
节点都需要填写完整
- name
name节点填写项目名称,没有具体要求,但是必须要有。需要注意的是如果项目结构是一个parent pom带若干子项目,每个pom.xml中都需要完善name
节点 - description
项目描述,可以比name多写一点。只需要在根节点配置 - url
我自己填写了项目wiki地址,github地址应该也可以,只需要在根节点配置 - licences
开源协议配置,github项目可以在项目主页点击create new file,文件名输入LICENCE.md或者LICENCE.txt,然后会提示选择开源协议模板,根据自己需要选择即可自动创建,不要忘记点提交。添加完LICENCE文件后需要在pom中添加licences节点:
<licenses>
<license>
<name>MIT Licence</name>
<url>licence file url</url>
<distribution>repo</distribution>
</license>
</licenses>
licence url可以填写github项目的licence文件路径,只需要在根节点配置
– developers
开发者信息,根据实际情况填写即可,只需要在根节点配置
<developers>
<developer>
<name></name>
<email></email>
</developer>
</developers>
- scm
项目地址信息,如下格式填写即可,只需要在根节点配置
<scm>
<connection>scm:git:https://github.com/foo/proj.git</connection>
<developerConnection>scm:git:https://github.com/foo/proj.git</developerConnection>
<tag>master</tag>
<url>https://github.com/foo/proj.git</url>
</scm>
注意:使用flatten-maven-plugin
的用户要把flattenMode
改为ossrh
或oss
,否则打包会自动删除以上信息
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.1.0</version>
<inherited>true</inherited>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>ossrh</flattenMode>
<outputDirectory>${project.build.directory}/effective-pom</outputDirectory>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
1.2. 完善plugins
提交oss要求包含source/javadoc/release plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>attach-sources</id>
<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>
<configuration>
<charset>utf-8</charset>
<encoding>utf-8</encoding>
<docencoding>utf-8</docencoding>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
这里有个小坑,javadoc对于注释格式要求比较严格,例如有return的方法一定要@return等,根据报错慢慢排查即可,不过比较难受的是输出的错误信息有乱码
2. 申请groupId
提交到central仓库首先需要申请groupId,而申请groupId的流程在sonatype的Jira系统中,所以首先你需要一个账号
2.1. 注册sonatype账号
访问https://issues.sonatype.org/
如果未登录会要求登录,没有账号可以点Sign Up,表单很简单,这里不做赘述
2.2. 提交issue申请groupId
申请groupId是以issue方式提交,登录成功后点上方的申请按钮,问题类型默认就是new project,概要和描述根据具体情况自行填写,比较重要的就是groupId了,由于这个groupId后面涉及到审核,最好是自己持有的域名,例如yixsoft.com
这里就填写com.yixsoft
;
后面的project url可以填写github首页地址,scm url需要填写带.git后缀的地址,页面上有例子,很容易填写
提交后可以得到一个OSSRH ID,这个id记不住也没关系,下次登录进来选择问题
->我的报告
就能找到。提交后注意关注后面的注释信息,官方会指导下一步处理
2.3. 审核groupId
官方收到申请后会要求审核groupId,如果域名是你自己持有就很好办了,官方推荐的方式就是给域名添加一条TXT记录,内容就是这个issue的OSSRH ID。其他情况见官方信息
配置完成后回复一下要求官方确认。官方确认后就可以把package deploy到oss.sonatype.org
了。
当然,我们还有一些额外的东西需要准备
3. 生成并上传gpg key
如果没有gpg软件首先到https://www.gnupg.org/download/ 下载对应操作系统的程序。如果是linux或者mac可以更简单的从软件仓库下载安装,这里不做赘述。
安装完成后执行(部分操作系统可能是gpg2
,下同)
gpg --gen-key
创建密钥对,会要求输入name和email
随后执行
gpg --list-key
查看系统中已存在的密钥,找到刚刚生成的条目,里面有一段hex格式的字符串,即key id,复制出来
随后上传密钥对到公钥库,官方使用的公钥库网站有:
– pool.sks-keyservers.net
– keys.gnupg.net
– keyserver.ubuntu.com
如果未生效可以在deploy时看到对应网站的错误日志。根据我的体验,ubuntu应该是最快的了
上传指令:
gpg --keyserver hkp://{domain} --send-keys {keyid}
可以使用如下指令查询公钥是否上传成功,后面可以跟email或者id
gpg --keyserver hkp://{domain} --search-keys ""
4. 配置maven部署过程
4.1. 配置settings.xml
servers
节点中新增一个条目,填入sonatype网站注册的username和password
<server>
<id>ossrh</id>
<username></username>
<password></password>
</server>
4.2. 配置pom.xml
如果不想每次自动提交可以配置profiles,具体profiles分级不做赘述
4.2.1. properties
<properties>
<gpg.executable>gpg</gpg.executable>
<gpg.keyname></gpg.keyname>
</properties>
这里的keyname
填写刚刚生成的gpg keyid,如果只有一个key可以省略,也可以自行配置default key,executable
根据实际情况填写gpg或gpg2
4.2.2. plugins
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</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.8</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
4.2.3. distribution
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
5. deploy
正常来说执行mvn clean deploy
即可提交,先用SNAPSHOT提交测试,正常提交后确认没有问题可以提交到release
首次release提交完成后注意要到sonatype的issue上回复要求确认,对方确认以后过几个小时就可以在mvnrepository.org
上搜索到了