内容目录
本文主要介绍如何发布自己的jar文件到Maven中央仓库,使用到的所有插件均为当前最新版本(有些旧的方法可能已经过时)。
注册Maven账号
由于Maven 中央仓库是由企业Sonatype,Inc.负责运营维护的,因此你需要先前往 https://issues.sonatype.org/secure/Signup!default.jspa 注册一个账号(如果你已经有了账号,可以跳过此步骤)。
新建 Sonatype Issue
登录了账号之后,你需要新建一个Issue。Issue是问题的意思,相当于你提交了一个工单给 Sonatype 的工作人员,申请开通Maven中央仓库的发布权限。
点击顶部的【新建】按钮,填写申请表单,即可提交申请。
注意:groupId 不能随意填写。
- 如果你(或所属机构)拥有自己的域名,可以填写自己的域名。工作人员在审核时,会反馈给你,要求验证域名的所有权,你可以采取如下两种方式之一完成验证:1、 为域名添加一个指向 Issue编号 的TXT记录; 2、将域名的访问重定向到你的项目主页地址(Project URL)。
- 如果你没有自己的域名,你只能使用项目托管方的域名。例如 你的项目在Github ,主页地址为 https://github.com/username/projectName,那么你只能使用 io.github.username 或 com.github.username 作为groupId。
提交成功后,你需要耐心等待审核。不过,请不用担心,Sonatype工作人员的审核效率是很高的,工作时间范围内,基本上一小时内就会响应。
提醒:需要验证域名所有权的情况下,记得在完成对应的域名解析记录操作后,回到Issue详情页面,点击【Respond】按钮,以通知工作人员进行再次审核。
装OpenPGP程序,创建密钥对
稍后在发布jar文件的时候,我们需要用到OpenPGP程序来对所有文件进行签名。便于其他用户在下载你的jar文件时进行校验,防止文件被恶意篡改。PGP的官方下载地址为:https://www.gnupg.org/download/#binary,你可以自行根据当前操作系统下载对应版本的安装程序 。
在这里,我们下载的是 Gpg4win 。安装完毕后,打开它自带的图形界面工具【Kleopatra】,点击左上角工具栏的【文件】->【新建密钥对】。
接着,填写你的个人信息(选填):
然后点击【下一步】->【新建】,之后程序要弹窗要求你输入 passphrase (这是密码,请牢记,下面要用到):
接着点击【OK】,你的密钥对就已经创建好了。最后,我们需要将密钥对中的公钥发布到 OpenPGP 的共用服务器上。选中我们刚才创建的密钥对,点击鼠标右键,在关联菜单中选择【在服务器上发布】即可。
准备发布jar包
通过审核之后,现在就该轮到你准备 deploy 你的jar包到 Maven 中央仓库了。
此时,我们先简单介绍一下从项目打包到最终发布完成的大致流程步骤:
- 使用相关的 Maven 插件将项目编译并打包成对应的字节码jar包(<name>-<version>-RELEASE.jar)、源代码jar包(<name>-<version>-RELEASE-sources.jar)、javadoc文件(<name>-<version>-RELEASE-javadoc.jar)。
- 使用 gpg 对上述jar文件进行签名。便于其他用户在下载文件时进行校验,防止文件被恶意篡改。
- 将上述所有文件发布到 https://oss.sonatype.org 的 Nexus 仓库。
- 上传成功后,登录你的 https://issues.sonatype.org 账号,回到你之前申请的 Issue 工单详情页面,提交评论告知 Sonatype 的工作人员:你已经成功发布了第一个版本(内容随意,大概表达了类似的意思即可),工作人员将会复审你的发布内容。审核通过后,你的项目jar文件就已经成功发布到 Maven Central 中央仓库了。
现在,我们正式动工。在对应项目的pom.xml文件中添加如下相应配置片段:
<licenses>
<license> <!-- 自行修改为对应的LICENSE声明 -->
<name>The Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer> <!-- 可以有多个 -->
<name>开发者名称</name>
<email>邮箱地址</email>
<organization>所属机构</organization>
</developer>
</developers>
<scm>
<url>项目的SVN或Git地址,例如:https:// github.com/CodePlayer/ready-x/tree/master</url>
<connection>scm:git:git://@github.com:CodePlayer/ready-x.git</connection>
<developerConnection>scm:git:ssh://git@github.com:CodePlayer/ready-x.git</developerConnection>
<tag>master</tag>
</scm>
上述部分配置,用于完善项目的权属声明。接着,我们继续添加如下部分的插件配置信息到pom.xml中。
<profiles>
<profile>
<id>ossrh</id> <!-- profile的id -->
<!-- 配置发布到的远程Nexus仓库地址 -->
<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>
<build>
<plugins>
<!-- 编译打包项目源代码为字节码jar文件,你懂的 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<debuglevel>lines,vars,source</debuglevel>
</configuration>
</plugin>
<!-- 打包项目源代码为jar文件,你懂的 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打包项目javadoc注释为jar文件,你懂的 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
<doclint>none</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 用于将所有jar文件部署至远程仓库的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 用于对所有文件进行签名 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<configuration>
<executable>gpg</executable> <!-- 该参数值取决于你的gpg程序在命令行中的名称,一般是"gpg"或"gpg2" -->
</configuration>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 用于将文件阶段性发布到远程 Nexus 仓库 -->
<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>
</plugins>
</build>
</profile>
</profiles>
注意,在这里我们使用了 Maven Profile,profile 的 id 为ossrh,以免与你其它用途的插件配置产生冲突。
接着,我们打开Maven安装目录下的配置文件conf/settings.xml,在对应的XML节点处添加如下配置片段:
<servers>
<server>
<id>ossrh</id>
<username>你注册的sonatype账户名</username>
<password>对应的密码</password>
</server>
</servers>
<profiles>
<profile>
<id>ossrh</id>
<properties>
<gpg.passphrase>你刚刚设置的PGP passphrase</gpg.passphrase>
</properties>
</profile>
</profiles>
最后,我们执行以下Maven命令,即可完成 deploy 到 OSS Nexus 仓库的所有步骤:
mvn clean deploy -P ossrh
如果你使用的是Eclipse,可以使用对应的 Maven命令图形界面:
最后,你只需要按照上述步骤中所说的那样,登录你的 https://issues.sonatype.org 账号,回到你之前申请的 Issue 工单详情页面,提交评论告知 Sonatype 的工作人员:你已经成功发布了第一个版本(内容随意,大概表达了类似的意思即可),工作人员将会复审你的发布内容。审核通过后,你的项目jar文件就已经成功发布到 Maven Central 中央仓库了。
本文主要参考 Maven 官方提供的相关英文文档: https://central.sonatype.org/pages/producers.html 。
1 条评论
额外补丁强调一句:在执行 Maven
deploy
命令时,一定要先执行clean
命令,也就是mvn clean deploy
,否则可能无法发布成功。撰写评论