Maven发布jar包全过程
- 1. 基本概念
- 1.1 sonatype jira
- 1.2 sonatype nexus
- 2. 发布过程
- 2.1 注册Sonatype JIRA账号
- 2.2 登录Sonatype JIRA
- 2.3 创建ISSUE
- 2.4 使用 GPG 生成密钥对
- 2.5 修改Maven配制
- 2.6 提交jar包到OSS
- 2.7 在 OSS中发布
- 2.8 通知Sonatype 已经成功发布
- 2.9 以后的提交过程
- 2.10 在中央仓库查询
- 2.11 在项目中引用maven坐标
1. 基本概念
1.1 sonatype jira
我的理解是sonatype jira的作用主要是利用在其上面注册的账号来登录sonatype nexus,因为发布的时候需要用到在jira的账号密码。所以要记住jira的账号密码。
如果要发布新的项目,在使用相同GroupId的情况下,与上面的过程一样。只有使用不同的GroupId的时候,才会需要再去提交Issue申请。具体发布过程请见下文。
1.2 sonatype nexus
sonatype nexus就是实际用来存储发布的jar包的。
这两个网站其实都是sonatype公司的。账号密码通用。
2. 发布过程
在发布前,您需要有自己的项目主页并开源的代码, 您可以使用GitHub或者码云,下面的内容以GitHub为例。
2.1 注册Sonatype JIRA账号
注册地址: https://issues.sonatype.org/secure/Signup!default.jspa 注册很简单,重要的是邮箱地址一定要正确,issue有任何变动都会通过邮件通知。
注册时,大家一定要用英文注册,不然会出现很多意想不到的问题!
2.2 登录Sonatype JIRA
注册完成后就登录: https://issues.sonatype.org/login.jsp
2.3 创建ISSUE
创建地址: https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
注意:
Summary和Description :这个自己填。注意要用英文
Group Id::这个必须要注意,如果你用的是GitHub,一定要是 com.github.你的github用户名。例如我的项
目地址是: https://github.com/MrKingHH/mydailypractice,那我的 groupId就是com.github.MrKingHH,当然也可以使用 GitHub的Page的域名 io.github.你的github用户名。 如果你有自己的域名和项目地址也可以,官方人员会询问你是否有这个域名的所有权。你需要提供相关信息证明这个域名是你在用。在你项目的pom里一定要使用这个groupId,最好包路径也使用。
Project URL: 是你的项目地址。
SCM url: 是你的项目git地址。
Username(s): 可以不用填,这是能辅助你提交项目的合作人的帐号,前提是他也得在这个Jira注册。
其他使用默认值就行了。
这是我填写并且审核通过的状态。
创建好Issue后就等待官方回复吧。通常如果在晚上22点23点的话回复会比较快,运气好几分钟就有回复了。因为人家在美国,中国时间22:00,那边才开始上班。
当看到回复类似 com.github.xxx has been prepared, now user(s) xxx can:Deploy snapshot artifacts into repository … 说明OK了,可以提交了。
2.4 使用 GPG 生成密钥对
在等待Issue的时候可以先把密钥搞好。Windows 系统,可以下载 Gpg4win 软件来生成密钥对。下载地址:https://www.gpg4win.org/download.html。 Linux和MacOS的还没研究怎么弄,不过应该很简单,大家自行google就行了。
安装完成后,打开CMD。大致分为以下步骤。
gpg --version ##查看是否安装成功,默认会帮你配置环境变量
gpg --gen-key ##生成密钥对。具体请看下文
gpg --list-keys ##查看公钥。具体请看下文
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 你的公钥指纹 ##将公钥发布到 PGP 密钥服务器
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 你的公钥指纹 ##查询公钥是否发布成功
我的完整过程请看下图:
gpg --gen-key
Real name: SamuelKing ## 用英文
Email address: jinyuxin0326@163.com
You selected this USER-ID:
"SamuelKing <jinyuxin0326@163.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
## 之后往下,会让你输入用户名和邮箱,还有一个Passphase(输入两次),相当于密钥库密码,不要忘记。
gpg --list-keys
--------------------------------------------------------
pub rsa2048 2019-09-19 [SC] [expires: 2021-09-18]
3ED8BC6276409036B349D1234706492FFBF807B3
uid [ultimate] SamuelKing <jinyuxin0326@163.com>
sub rsa2048 2019-09-19 [E] [expires: 2021-09-18]
## 其中一串16进制的代码就是你的公钥。
2.5 修改Maven配制
如果你的Issue通过了,那么可以开始提交项目了。
修改maven全局配制文件 settings.xml,在maven安装目录的conf文件夹下。
这里的 id 是要在 pom.xml 里面使用的,用户名和密码就是Jira的帐号密码。
我的pom.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xyz.jinyuxin</groupId>
<artifactId>core</artifactId>
<version>0.1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<name>data structure core code</name>
<description>This is a test project.</description>
<url>http://www.jinyuxin.xyz/</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>MrKingHH</name>
<email>jinyuxin0326@163.com</email>
</developer>
</developers>
<scm>
<connection>scm:git:git@github.com:MrKingHH/mydailypractice.git</connection>
<developerConnection>scm:git:git@github.com:MrKingHH/mydailypractice.git</developerConnection>
<url>scm:git:git@github.com:MrKingHH/mydailypractice.git</url>
</scm>
<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>
<!-- 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>
<distributionManagement>
<snapshotRepository>
<id>oss</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>oss</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</profile>
</profiles>
</project>
pom.xml 中必须包括:name、description、url、licenses、developers、scm 等基本信息,使用了 Maven 的 profile 功能,只有在 release 的时候才创建源码包、文档包、使用 GPG 进行数字签名。
此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。
如果是多模块项目的话,只需要在父 pom.xml 中声明这些,子 pom.xml 中只需要修改相应的一些信息,如 name 标签。
snapshotRepository :当<version>1.0-SNAPSHOT</version>这种以SNAPSHOT结尾时会deploy到https://oss.sonatype.org/content/repositories/snapshots/下面。
repository :<version>0.1.0</version>不以SNAPSHOT结尾时会deploy到https://oss.sonatype.org/service/local/staging/deploy/maven2/下面。
上图一个是deploy到了snapshotRepository,一个是deploy到了repository 。
2.6 提交jar包到OSS
maven配制修改完成后,就可以提交项目了,使用命令:
mvn clean deploy -P release ##deploy到snapshot的仓库
当执行以上 Maven 命令时,会自动弹出一个对话框,需要输入上面提到的 Passphase,它就是刚才设置的 GPG 密钥库的密码。
注意:此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,下面才是真正的发布。
执行上面的命令的过程中,可能会找不到gpg.exe, 检查环境变量,发现环境变量中已经配制了gpg.exe所在的路径,但是还是报错… 如何解决? setting.xml中加入:
<profile>
<id>release</id>
<properties>
<gpg.executable>D:/Mysoftware/GnuPG/bin/gpg.exe</gpg.executable>
<gpg.passphrase>上面提到的 Passphase</gpg.passphrase>
</properties>
</profile>
注意ID要与pom.xml里的发布的 profile 的ID对应。
其中<gpg.executable>为你的gpg.exe的完整路径。
<gpg.passphrase> 为上面提到的 Passphase,这样就不用在每次发布的时候都输入密码了,但是我发现即便有这个,有时候(只是有时,不是每次)还是要让输入密码,暂时不清楚是什么问题。
上面这2个配制也可以配制到pom.xml的gpg插件的<configuration>中,去掉<gpg.>就行,当然密码最好还是不要放在pom.xml里,因为如果你的代码开源的话,密码也一起开源了。
如何发布快照版本?
在pom.xml中的项目版本号后面加上 -SNAPSHOT 就行。
快照版到这里就发布好了,不需要执行下面的关闭、发布构建步骤,构建列表里也找不到快照版的构建,快照版发布后就可以直接引用了。
2.7 在 OSS中发布
使用 Jira 账号登录 https://oss.sonatype.org,在 Staging Repositories 中查看刚才已上传的构件。
一般发布的构件不多,可以直接滚动条拉到最后就能看到自己的构件,或者更改时间排序,也可进行模糊查询定位到自己的构件。
找到自己的构建后选中,并点击上方的 【Close】按钮关闭构建,这个过程有点慢,稍等几分钟。
刷新页面,发现关闭成功后,再次选中自己的构建,点击上方的【Release】发布构建.。
下图是release成功的状态。
可以在Advanced serarch中搜索已经发布的jar包。
2.8 通知Sonatype 已经成功发布
在Issue通过审核的官方回复中,通常会让你在发布成功后再次回复告知他们,在刚才那个Issue中回复已经成功发布,官方会回复你大概需要等多久才能在中央仓库中找到你的项目(10分钟左右)以及要多久才能在搜索中搜到(2个小时左右)。
2.9 以后的提交过程
第一次提交才这么麻烦,以后提交只用重复maven发布,OSS中Close,Release的过程就可以了,当然需要等待的时间还是10分钟和2小时。
如果要发布新的项目,在使用相同GroupId的情况下,与上面的过程一样。只有使用不同的GroupId的时候,才会需要再去提交Issue申请。
当然如果你没有换电脑的话 GPG 的过程只需要一次就行。
2.10 在中央仓库查询
大约两个小时后,在网站https://search.maven.org可以查到自己发布的jar包。
2.11 在项目中引用maven坐标
可以看到,已经成功引入了jar包。