Maven发布jar包全过程(详细)

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包全过程(详细)_第1张图片
注意:

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包全过程(详细)_第2张图片
创建好Issue后就等待官方回复吧。通常如果在晚上22点23点的话回复会比较快,运气好几分钟就有回复了。因为人家在美国,中国时间22:00,那边才开始上班。
当看到回复类似 com.github.xxx has been prepared, now user(s) xxx can:Deploy snapshot artifacts into repository … 说明OK了,可以提交了。
Maven发布jar包全过程(详细)_第3张图片

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包全过程(详细)_第4张图片

gpg --gen-key
Real name: SamuelKing ## 用英文
Email address: [email protected]
You selected this USER-ID:
"SamuelKing "
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 
sub   rsa2048 2019-09-19 [E] [expires: 2021-09-18]
## 其中一串16进制的代码就是你的公钥。

2.5 修改Maven配制

如果你的Issue通过了,那么可以开始提交项目了。
修改maven全局配制文件 settings.xml,在maven安装目录的conf文件夹下。
Maven发布jar包全过程(详细)_第5张图片
这里的 id 是要在 pom.xml 里面使用的,用户名和密码就是Jira的帐号密码。
我的pom.xml配置如下:


<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.0modelVersion>

    <groupId>xyz.jinyuxingroupId>
    <artifactId>coreartifactId>
    <version>0.1.0version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <configuration>
                    <source>8source>
                    <target>8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
        plugins>
    build>

    <name>data structure core codename>
    <description>This is a test project.description>
    <url>http://www.jinyuxin.xyz/url>
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txturl>
        license>
    licenses>
    <developers>
        <developer>
            <name>MrKingHHname>
            <email>[email protected]email>
        developer>
    developers>
    <scm>
        <connection>scm:git:[email protected]:MrKingHH/mydailypractice.gitconnection>
        <developerConnection>scm:git:[email protected]:MrKingHH/mydailypractice.gitdeveloperConnection>
        <url>scm:git:[email protected]:MrKingHH/mydailypractice.giturl>
    scm>

    <profiles>
        <profile>
            <id>releaseid>
            <build>
                <plugins>
                    
                    <plugin>
                        <groupId>org.apache.maven.pluginsgroupId>
                        <artifactId>maven-source-pluginartifactId>
                        <version>2.2.1version>
                        <executions>
                            <execution>
                                <phase>packagephase>



                            execution>
                        executions>
                    plugin>
                    
                    <plugin>
                        <groupId>org.apache.maven.pluginsgroupId>
                        <artifactId>maven-gpg-pluginartifactId>
                        <version>1.5version>
                        <executions>
                            <execution>
                                <phase>verifyphase>
                                <goals>
                                    <goal>signgoal>
                                goals>
                            execution>
                        executions>
                    plugin>
                plugins>
            build>
            <distributionManagement>
                <snapshotRepository>
                    <id>ossid>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/url>
                snapshotRepository>
                <repository>
                    <id>ossid>
                    <url>https://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 :当1.0-SNAPSHOT这种以SNAPSHOT结尾时会deploy到https://oss.sonatype.org/content/repositories/snapshots/下面。
repository :0.1.0不以SNAPSHOT结尾时会deploy到https://oss.sonatype.org/service/local/staging/deploy/maven2/下面。

Maven发布jar包全过程(详细)_第6张图片
Maven发布jar包全过程(详细)_第7张图片
上图一个是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>releaseid>
  <properties>
    <gpg.executable>D:/Mysoftware/GnuPG/bin/gpg.exegpg.executable>
    <gpg.passphrase>上面提到的 Passphasegpg.passphrase>
  properties>
profile>
注意ID要与pom.xml里的发布的 profile 的ID对应。
其中为你的gpg.exe的完整路径。
 为上面提到的 Passphase,这样就不用在每次发布的时候都输入密码了,但是我发现即便有这个,有时候(只是有时,不是每次)还是要让输入密码,暂时不清楚是什么问题。
上面这2个配制也可以配制到pom.xml的gpg插件的中,去掉就行,当然密码最好还是不要放在pom.xml里,因为如果你的代码开源的话,密码也一起开源了。
如何发布快照版本?
在pom.xml中的项目版本号后面加上 -SNAPSHOT 就行。
快照版到这里就发布好了,不需要执行下面的关闭、发布构建步骤,构建列表里也找不到快照版的构建,快照版发布后就可以直接引用了。

2.7 在 OSS中发布

使用 Jira 账号登录 https://oss.sonatype.org,在 Staging Repositories 中查看刚才已上传的构件。
一般发布的构件不多,可以直接滚动条拉到最后就能看到自己的构件,或者更改时间排序,也可进行模糊查询定位到自己的构件。
找到自己的构建后选中,并点击上方的 【Close】按钮关闭构建,这个过程有点慢,稍等几分钟。
刷新页面,发现关闭成功后,再次选中自己的构建,点击上方的【Release】发布构建.。

下图是release成功的状态。
Maven发布jar包全过程(详细)_第8张图片
可以在Advanced serarch中搜索已经发布的jar包。
Maven发布jar包全过程(详细)_第9张图片

2.8 通知Sonatype 已经成功发布

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

Maven发布jar包全过程(详细)_第10张图片

2.9 以后的提交过程

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

2.10 在中央仓库查询

大约两个小时后,在网站https://search.maven.org可以查到自己发布的jar包。
Maven发布jar包全过程(详细)_第11张图片

2.11 在项目中引用maven坐标

可以看到,已经成功引入了jar包。
Maven发布jar包全过程(详细)_第12张图片
本文有很大一部分内容是参考:https://www.jianshu.com/p/8c3d7fb09bce,感谢博主。

你可能感兴趣的:(教程,DistKV项目相关问题,maven,deploy,中央仓库)