发布Jar到Maven中央仓库--Maven版(最新方式)

摘要

一、将项目推送到远程仓库,如 Github或者Gitee

二、注册 Sonatype 账户

进入 https://central.sonatype.com 注册一个账号,邮箱要真实。

三、登录 Sonatype 创建Namespace

  • 进入 Namespace 模块,然后点击 Add Namespace 按钮,Namespace 具有唯一性

  • 发布前一定要创建Namespace,实际上就是项目的Group Id,因为要进行验证,所以这里不能随便填写,你可以配置为你拥有的域名,比如我的域名是hanqunfeng.com,这里就填写com.hanqunfeng。域名的验证方法是配置DNS TXT记录。

  • 如果你没有域名,也可以使用Github的域名,比如我的Github用户名是hanqunfeng,则这里可以配置为io.github.hanqunfeng。Github的验证方式是根据给定个名称创建一个public repository。

四、发布

  • 1.准备签名

    • 可以使用工具创建密钥对
      需要下载一个签名工具,我是mac电脑,下载的是https://gpgtools.org
      安装后点击新建,按照提示创建一个密钥对即可,注意高级选项里有个过期时间,默认是3年。创建好后会主动提示你是否将公钥发布到key server,点击Upload Public key即可。也可以在创建后的证书列表页面邮件选择证书–>Send Public Key To Key Server

    导出证书时,勾选密码并设置密码就是私钥和公钥证书,不勾选密码就是公钥,看生成文件的名称就可以,公开就是公钥,私密就是私钥,格式都是asc,其实就是字符串,可以用记事本打开查看。

    如果windows系统,可以下载https://www.gpg4win.org/ ,使用方式差不多,最后点击“将公钥上传的目录服务”。

    公钥发布到key server后要稍微等一会,大约10分钟吧,因为key server有多个,同步需要一些时间。
    记住你创建密钥对时的密码,发布项目时要使用。

    • 也可以使用命令行创建密钥对,版本[gpg (GnuPG/MacGPG2) 2.2.24]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      # 创建密钥对,按提示输入用户名称和邮箱地址
      gpg --generate-key

      # 列出密钥,hanqunfeng就是创建密钥对是的用户名,此处也可以使用邮箱
      # 结果中第二行一长串的后8位就是keyId,比如:30FF8D58,gradle构建时会用到
      gpg --list-keys hanqunfeng
      # 也可以直接通过id查询
      gpg --list-keys 30FF8D58

      # 上传公钥到server key,默认上传到hkps://keys.openpgp.org,但是提示上传失败
      # 看到网上的示例可以通过--keyserver指定上传的服务器地址,但是我这个版本[gpg (GnuPG/MacGPG2) 2.2.24]没有这个参数
      # 使用 https://gpgtools.org 上传公钥就会成功
      gpg --send-keys 30FF8D58

      # 查看指纹
      gpg --fingerprint 30FF8D58

      # 删除私钥,这里也可以使用用户名称或者邮箱,如果唯一的话
      gpg --delete-secret-keys 30FF8D58

      # 删除公钥
      gpg --delete-keys 30FF8D58
  • 2.settings.xml
    配置 mavensettings.xml 文件,设置一个 server,里面添加 User Token

登录https://central.sonatype.com后点击右上角的用户名称–> View Account --> Generate User Token

1
2
3
4
5
6
7
8
9
10
11
<settings>
[...]
<servers>
[...]
<server>
<id>maven-central</id>
<username>username</username>
<password>token</password>
</server>
</servers>
</settings>
  • 3.pom.xml,重点是后面几个plugin
    这里重点说一下central-publishing-maven-plugin这个插件,该插件会将jar包推送到Maven Central仓库,如果插件没有配置参数autoPublishtrue,则但此时发布的jar会处于VALIDATED状态,需要登录https://central.sonatype.com后切换到Deployment,找到我们刚刚上传的包名,然后点击右侧的Publish按钮,如果一切顺利,大于10分钟后其状态变为PUBLISHED,表示发布成功。如果发布失败,其状态会变更为FAILED,可以在Component Summary中查看失败原因,重新发布即可。

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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
<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>io.github.hanqunfeng</groupId>
<artifactId>aws-s3-v2-tools</artifactId>
<version>1.0.1</version>
<packaging>jar</packaging>
<name>aws-s3-v2-tools</name>

<description>
AWS S3 Tools.
</description>
<url>https://blog.hanqunfeng.com</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<id>hanqf</id>
<name>hanqunfeng</name>
<email>qunfeng_han@126.com</email>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/hanqunfeng/aws-s3-v2-tools.git
</connection>
<developerConnection>
scm:git:https://github.com:hanqunfeng/aws-s3-v2-tools.git
</developerConnection>
<url>https://github.com/hanqunfeng/aws-s3-v2-tools</url>
</scm>

<properties>
<java.version>1.8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.23.10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>

<!-- 为避免Potential Conflicts,你应该将commons-logging.jar从classpath中删除。你可以尝试从项目依赖中排除commons-logging,这样你的应用程序就会被强制使用Spring JCL而不是Commons Logging。 -->
<!-- 问题:Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
</dependency>

<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>aws-crt-client</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.32</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.29</version>
</dependency>

</dependencies>


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-source</id>
<phase>verify</phase>
<goals>
<!--生成源代码的jar -->
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>attach-javadoc</id>
<phase>verify</phase>
<goals>
<!--生成javadoc的jar -->
<goal>jar</goal>
<!--生成javadoc的html -->
<goal>javadoc</goal>
</goals>
<configuration>
<!--不显示javadoc警告-->
<additionalOptions>-Xdoclint:none</additionalOptions>
<additionalJOption>-Xdoclint:none</additionalJOption>
</configuration>
</execution>
</executions>
</plugin>

<!-- gpg plugin,用于签名认证 -->
<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>

<!-- 发布到私服时需要注释掉下面两个插件 -->
<!--staging puglin,用于自动执行发布阶段(免手动)-->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.5.0</version>
<extensions>true</extensions>
<configuration>
<!-- 这里的publishingServerId是在settings.xml中配置的server认证信息 -->
<publishingServerId>maven-central</publishingServerId>
<!-- 这里的autoPublish是自动发布,而不是手动发布 -->
<autoPublish>true</autoPublish>
<!-- 这里的waitUntil配置为published是等待发布完成,因为发布完成的时间比较长,所以可以不加这个参数 -->
<waitUntil>published</waitUntil>
<!-- 这里的deploymentName是发布到中央仓库的名称 -->
<deploymentName>${project.groupId}:${project.artifactId}:${project.version}</deploymentName>
</configuration>
</plugin>
<!-- release plugin,用于发布到release仓库部署插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>



</plugins>
</build>

<distributionManagement>
<!-- <repository>-->
<!-- <id>maven-releases</id>-->
<!-- <name>Nexus Release Repository</name>-->
<!-- <url>http://nexus.cxzh.ltd:8081/repository/maven-releases/</url>-->
<!-- </repository>-->
<!-- <snapshotRepository>-->
<!-- <id>maven-snapshots</id>-->
<!-- <name>Nexus Snapshot Repository</name>-->
<!-- <url>http://nexus.cxzh.ltd:8081/repository/maven-snapshots/</url>-->
<!-- </snapshotRepository>-->

</distributionManagement>
</project>

  • 4.执行命令

1
2
3
mvn clean package # 完成打包和测试
mvn clean verify # 完成源码打包和javadoc打包,同时完成签名
mvn clean deploy # 完成本地部署和maven中央仓库部署

4.1 执行过程中会提示你输入创建密钥对时的密码,如果不想人工参与,也可以使用如下方式(参考:http://maven.apache.org/plugins/maven-gpg-plugin/usage.html)

  • a.在执行命令时指定密码:

    1
    mvn clean deploy -Dgpg.passphrase=thephrase
  • b.setting.xml中创建一个server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <settings>
    [...]
    <servers>
    [...]
    <server>
    <id>gpg.passphrase</id>
    <passphrase>clear or encrypted text</passphrase>
    </server>
    </servers>
    </settings>
  • 6.更新部署
    修改pom.xml中的版本号,重新执行mvn clean deploy即可。发布的jar包可以在https://central.sonatype.com中检索。