前言
如果我们开发一个 Java 的开源库,要让其他人可以轻松下载到,那就要把它发布到中央仓库。接下来我们讲讲如何利用 Maven 将 Java 项目发布到中央仓库。
Maven 中央仓库
平时我们开发 Java 项目配置的依赖都可以从 Maven 中央仓库或者其镜像仓库下载。Maven 中央仓库由 Sonatype 公司进行维护,网址是 https://central.sonatype.com/,当然不少公司也维护了自己的开源仓库,我们主要讲讲怎么将 Java 库发布到中央仓库。
注册账户
首先需要在它们的网站上注册一个账户。点击右上角的登陆(Sign In)打开登陆页面,然后点击注册(Sign up),跟着向导一步步操作即可。
创建命名空间
注册成功之后系统会弹出一个添加命名空间的界面。发布依赖需要一个命名空间,也就是 maven 依赖的 groupId。如果自己没有申请公网域名的话,可以使用 github 的免费域名。如果使用 github 账户登录,有可能不会弹出这个界面。因为系统自动创建一个 io.github.<GitHub username>
的命名空间。
验证命名空间
我们需要验证域名的所有权。
如果是 github 域名,在自己的 github 上创建一个临时项目,证明域名是自己的。系统会提供一个临时仓库名字,域名验证成功后可以删除。
如果是其他域名,需要添加 DNS 的 TXT 记录(https://central.sonatype.org/faq/how-to-set-txt-record/)。
创建之后,等待一会儿,就可以看到命名空间的状态变为 Verified 已验证。
配置 POM 文件
接下来就是最重要的配置项目的 POM 文件了。官方对 POM 文件有一些基本要求,有以下几个方面。
增加标签
主要需要添加几个标签,如下所示:
<project>
<url>https://github.com/xxx/xxx</url>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/xxx/xxx/issues</url>
</issueManagement>
<scm>
<connection>scm:git:https://github.com/xxx/xxx.git</connection>
<developerConnection>scm:git:git@github.com:xxx/xxx.git</developerConnection>
<url>https://github.com/xxx/xxx</url>
</scm>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>xxx</id>
<name>xxx</name>
<email>xxx@xxx.com</email>
<organizationUrl>https://github.com/xxx</organizationUrl>
<roles>
<role>owner</role>
<role>developer</role>
</roles>
</developer>
</developers>
</project>
每次发布前也注意修改我们项目的版本号,维护好版本号也是对使用者负责。
部署包带上 source 文件和 doc 文件
Sonatype 要求部署的包要附带源代码及 API 文档 ,需要 GPG 加密,只需在 pom 文件中添加插件即可。
<!-- 源代码插件 -->
<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>
</plugin>
<!-- JavaDoc 插件 -->
<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>
</plugin>
<!-- GPG 签名插件 -->
<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.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.4.0</version>
<extensions>true</extensions>
<configuration>
<!-- 对应后面配置的 serverId -->
<publishingServerId>central</publishingServerId>
<tokenAuth>true</tokenAuth>
</configuration>
</plugin>
GPG签名
找一个 GPG 工具(可参考官方推荐),安装之后生成 GPG 密钥。
# 创建密钥
gpg --gen-key
# 输入姓名、邮箱等信息
# 完成后可查看
gpg --list-keys
类似下图所示。
GPG 是密钥对,需要将公钥发布上去,自己保存好私钥。
# 我们把公钥放到 ubuntu 的服务器上,指定 key id
gpg --keyserver keyserver.ubuntu.com --send-keys D822B4xxxxxxxxx
这一步官方也有详细的操作指南。
使用 Maven 发布
发布前需要在 Sonatype 网站上获取 token。
然后在 Maven 的 settings.xml 文件中配置发布服务器账号。
<settings>
<servers>
<server>
<id>central</id>
<username>token-username</username>
<password>token-password</password>
</server>
</servers>
</settings>
然后我们使用 Maven 的命令发布。
# 为了节省时间这里跳过单元测试
mvn deploy -DskipTests
执行成功之后,在 sonatype 网站就可以看到上传的文件了。但这个时候还没有真正地发布,点击 Publish 按钮。
查看状态修改后才算真正地发布了,如果我们使用 Maven 中央仓库,应该很快就能下载到,如果是其他镜像仓库,可能要等上一天左右。
就是这么简单,赶紧去发布我们的 Java 库吧。