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

maven引入的jar带时间戳 maven发布jar_中央仓库


注意:

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注册。
其他使用默认值就行了。

这是我填写并且审核通过的状态。

maven引入的jar带时间戳 maven发布jar_maven引入的jar带时间戳_02


创建好Issue后就等待官方回复吧。通常如果在晚上22点23点的话回复会比较快,运气好几分钟就有回复了。因为人家在美国,中国时间22:00,那边才开始上班。

当看到回复类似 com.github.xxx has been prepared, now user(s) xxx can:Deploy snapshot artifacts into repository … 说明OK了,可以提交了。

maven引入的jar带时间戳 maven发布jar_maven引入的jar带时间戳_03

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 你的公钥指纹 ##查询公钥是否发布成功

我的完整过程请看下图:

maven引入的jar带时间戳 maven发布jar_中央仓库_04

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文件夹下。

maven引入的jar带时间戳 maven发布jar_maven_05


这里的 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/下面。

maven引入的jar带时间戳 maven发布jar_maven_06


maven引入的jar带时间戳 maven发布jar_deploy_07


上图一个是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成功的状态。

maven引入的jar带时间戳 maven发布jar_maven引入的jar带时间戳_08


可以在Advanced serarch中搜索已经发布的jar包。

maven引入的jar带时间戳 maven发布jar_中央仓库_09

2.8 通知Sonatype 已经成功发布

在Issue通过审核的官方回复中,通常会让你在发布成功后再次回复告知他们,在刚才那个Issue中回复已经成功发布,官方会回复你大概需要等多久才能在中央仓库中找到你的项目(10分钟左右)以及要多久才能在搜索中搜到(2个小时左右)。

maven引入的jar带时间戳 maven发布jar_maven引入的jar带时间戳_10

2.9 以后的提交过程

第一次提交才这么麻烦,以后提交只用重复maven发布,OSS中Close,Release的过程就可以了,当然需要等待的时间还是10分钟和2小时。
如果要发布新的项目,在使用相同GroupId的情况下,与上面的过程一样。只有使用不同的GroupId的时候,才会需要再去提交Issue申请。
当然如果你没有换电脑的话 GPG 的过程只需要一次就行。

2.10 在中央仓库查询

大约两个小时后,在网站https://search.maven.org可以查到自己发布的jar包。

maven引入的jar带时间戳 maven发布jar_中央仓库_11

2.11 在项目中引用maven坐标

可以看到,已经成功引入了jar包。

maven引入的jar带时间戳 maven发布jar_maven引入的jar带时间戳_12