Maven部署到中央仓库全流程

详细介绍把Mavne项目上传到Maven中央仓库:https://mvnrepository.com ,上传完后可以在中央仓库搜索到你的项目。
首次上传到中央仓库还是挺繁琐的,大约需要一天多时间。

  1. 注册JIRA账号;
  2. JIRA创建问题,用来申请发布到Nexus私有仓库;
  3. 安装并配置gpg;
  4. 配置全局Maven和项目Maven;
  5. 上传到Nexus仓库;
  6. 发布到中央仓库。

注册JIRA账号

注册地址:https://issues.sonatype.org/secure/Signup!default.jspa

创建问题

通过在JIRA上创建Issue来申请发布新的jar包,Sonatype的工作人员会进行审核,审核不算严格,一般按照要求填写不会有问题。
创建问题链接:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

必须填写的项:

  • 概要: Maven项目的简介
  • Group Id:项目组织唯一的标识符
    一般是域名,可以用Github公用域名或者用自己拥有的域名。
    1. Github公用域名:com.github
    2. 自己的域名:[域名反写],例如我的域名是juhewo.org,反写后org.juhewu
      如果是自己的域名,Sonatype的工作人员会验证该域名是不是真的属于你,见下一步骤。
  • Project URL:输入项目地址;
  • SCM url:代码地址。

提示:一个Group Id创建一个Issue就可以。

paste image

paste image

确认域名(Github域名的跳过此步骤)

提交Issus后会收到一封邮件,邮件里的大致内容是:
询问你该Group Id设置的域名是否为你自己所拥有,如果是就需要证明一下,两种方法:

  1. 在域名DNS解析中添加一条类型为TXT的记录:[Issus编号];
  2. 设置Github Page当做域名。

使用方式1在阿里云域名DNS解析配置:https://dns.console.aliyun.com/?spm=a2c1d.8251892.nav-right.1.508e5b76D0gJWd#/dns/domainList
依次点击或输入解析配置->添加记录->记录类型选择:TXT->记录值输入:OSSRH-57549
验证是否设置成功,可以在终端使用nslookup -type=txt juhewu.org验证,查看返回值中是否有包括OSSRH-57549的内容;

给Sonatype反馈

在JIRA对应的Issus点击Responsed,然后等待审核通过,通过后会邮件通知。

安装并配置gpg

发布到Maven仓库中的所有文件都要使用GPG签名,以保障完整性。因此,我们需要在本地安装并配置GPG。

安装gpg

Mac可以使用brew安装。其它操作系统安装见gpg官网:https://gpgtools.org

1
2
# 安装gpg
brew install gpg

生成公密钥

1
2
# 生成公私钥
gpg --gen-key

生成密钥时将需要输入name、email。
需要把公钥和密钥记下来:

  • 密钥的值:gpg: 密钥被标记为绝对信任之间的值;
  • 公钥的值:pub的下一行。

paste image

上传GPG公钥

  1. 将公钥上传到公共的密钥服务器,这样其他人才可以通过公钥来验证jar包的完整性。
  2. 公钥必须要上传到两个服务器,只上传一个会出现签名错误的问题。
  3. hkp协议默认端口是11371,写不写都可以。

把公钥换成你的公钥。

1
2
3
## 上传公钥
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
gpg --keyserver hkp://keyserver.ubuntu.com --send-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4

查看公钥是否发布成功

把公钥换成你的公钥。

1
2
3
# 查看公钥是否发布成功
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4

查询本地所有公钥

1
2
# 查询本地所有公钥
gpg --list-keys

配置Maven

配置全局Maven

在Maven配置文件settings.xml的servers节点配置中央仓库的用户名、密码,就是第一步(注册JIRA账号)注册的用户名、密码,***替换成你的密码。

1
2
3
4
5
6
7
8
9
10
<server>
<id>sonatype_releases</id>
<username>duanjw</username>
<password>***</password>
</server>
<server>
<id>sonatype_snapshots</id>
<username>duanjw</username>
<password>***</password>
</server>

brew安装的Maven,配置文件在:/usr/local/Cellar/maven/3.6.0/libexec/conf/settings.xml,版本号换成你的版本号。

配置项目Maven

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<groupId>org.juhewu</groupId>
<artifactId>mail-spring-boot-project</artifactId>
<version>${revision}</version>


<packaging>pom</packaging>

<name>Juhe mail Spring Boot Project</name>
<description>聚合邮件的Spring Boot项目</description>
<url>https://github.com/juhewu/mail-spring-boot-project</url>


<properties>
<maven_javadoc_version>3.0.1</maven_javadoc_version>
<maven_surefire_version>2.19.1</maven_surefire_version>
<revision>0.0.1</revision>
</properties>

<organization>
<name>juhewu</name>
<url>https://github.com/juhewu/</url>
</organization>


<scm>
<url>https://github.com/juhewu/sms-spring-boot-project</url>
<connection>scm:git:git:////github.com/juhewu/sms-spring-boot-project.git</connection>
<developerConnection>scm:git:ssh://git@//github.com/juhewu/sms-spring-boot-project.git
</developerConnection>
</scm>

<issueManagement>
<system>Github</system>
<url>https://github.com/juhewu/sms-spring-boot-project/issues</url>
</issueManagement>

<mailingLists>
<mailingList>
<name>Development List</name>
<subscribe>dev-subscribe@dubbo.apache.org</subscribe>
<unsubscribe>dev-unsubscribe@dubbo.apache.org</unsubscribe>
<post>dev@juhewu.org</post>
</mailingList>
</mailingLists>
<developers>
<developer>
<id>duanjiawei</id>
<name>段佳维</name>
<email>dev@juhewu.org</email>
<url>https://github.com/juhewu</url>
</developer>
</developers>

<!-- 许可证信息 -->
<licenses>
<!-- Apache许可证 -->
<!-- <license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>-->
<!-- MIT许可证 -->
<license>
<name>MIT License</name>
<url>http://www.opensource.org/licenses/mit-license.php</url>
</license>
</licenses>

<!-- 发布管理信息 -->
<distributionManagement>
<repository>
<!-- 这里的id必须要和全局配置中的release id 一致 -->
<id>sonatype_releases</id>
<name>Nexus Release Repository</name>
<!-- 这里就是在创建issue成功后,对方回复的release发布地址-->
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
</repository>
<snapshotRepository>
<!-- 这里的id必须要和全局配置中的snapshot id 一致 -->
<id>sonatype_snapshots</id>
<name>Nexus Snapshot Repository</name>
<!-- 这里就是在创建issue成功后,对方回复的snapshot发布地址-->
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>

<profiles>
<profile>
<id>release</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<!-- 要生成Javadoc和Source jar文件,您必须配置javadoc和源Maven插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<aggregate>true</aggregate>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 生成sources源码包的插件 -->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<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.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

上传到Nexus仓库

gpg.passphrase后边的值就是你的私钥

1
mvn clean deploy -Darguments="gpg.passphrase=4E177C80E2A52BAE"

发布到中央仓库

  1. 打开:https://oss.sonatype.org/#stagingRepositories
  2. 点击Staging Repositories,选中你刚上传的项目,点击Close,会执行项目校验,刷新页面在Activity查看校验进度,所有校验必须全部通过后才能发布到中央仓库。
  3. 校验通过后点击Release即可同步到中央仓库。同步到中央仓库需要时间,可能需要10个小时。
  4. 发布后可在https://mvnrepository.com查看。

日志

生成公私钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
➜  ~  gpg --gen-key
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注意:使用 “gpg --full-generate-key” 以获得一个功能完整的密钥产生对话框。

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: 段佳维
电子邮件地址: 554343346@qq.com
您正在使用‘utf-8’字符集。
您选定了此用户标识:
“段佳维 <554343346@qq.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: /Users/duanjw/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 D7B837A7BC02D4D4 被标记为绝对信任
gpg: 目录‘/Users/duanjw/.gnupg/openpgp-revocs.d’已创建
gpg: 吊销证书已被存储为‘/Users/duanjw/.gnupg/openpgp-revocs.d/1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4.rev’
公钥和私钥已经生成并被签名。

pub rsa2048 2020-05-13 [SC] [有效至:2022-05-13]
1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
uid 段佳维 <554343346@qq.com>
sub rsa2048 2020-05-13 [E] [有效至:2022-05-13]

上传公私钥

1
2
3
4
➜  ~ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
gpg: 正在发送密钥 D7B837A7BC02D4D4 到 hkp://pool.sks-keyservers.net
➜ ~ gpg --keyserver hkp://keyserver.ubuntu.com --send-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
gpg: 正在发送密钥 D7B837A7BC02D4D4 到 hkp://keyserver.ubuntu.com

查看公私钥

1
2
3
4
5
6
7
8
➜  ~ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
gpg: 密钥 D7B837A7BC02D4D4:“段佳维 <554343346@qq.com>” 未改变
gpg: 处理的总数:1
gpg: 未改变:1
➜ ~ gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 1E7ED4B3F86ECAD38FF9BFE9D7B837A7BC02D4D4
gpg: 密钥 D7B837A7BC02D4D4:“段佳维 <554343346@qq.com>” 未改变
gpg: 处理的总数:1
gpg: 未改变:1
坚持原创技术分享,您的支持将鼓励我继续创作!