将项目上传到 Maven 中央仓库(2023最新,巨详细)

Maven 中央仓库发包流程

官方文档:https://central.sonatype.org/publish/publish-maven/#a-complete-example-pom

整体流程

  1. 注册 Jira Software
  2. 新建问题
  3. 完成域名所有权的验证
  4. 配置 gpg 密钥
  5. 配置 setting.xml
  6. 配置 pom.xml
  7. 上传

具体操作

  1. 注册 Jira Software :https://issues.sonatype.org/secure/Dashboard.jspa

2. 新建申请

  • 前两个默认值没有必要改动
  • Group Id 填域名或 io.github.用户名(后续验证会验证域名或 GitHub 账号的所有权)
  • Project URL 和 SCM url 按照实例填
  • Username(s) 指能够向这个 Group Id 发包的 jira 用户

3. 查看新建的申请并等待审核(一般5-10分钟)

然后官方的机器人会给一个评论让我们完成验证

根据评论的提示,如果我们的 Group Id 是域名,则需要给域名添加一条解析记录;如果是 GitHub 的话,则需要创建一个新的仓库来完成验证;做完之后将问题调整为开放状态等待审核(因为我这里是已经完成了,所以是已解决状态)

审核成功之后会有如下评论

4. 下载 GPG 工具,在命令行执行 gpg --gen-key 命令,按照指示生成密钥对。gpg --list-keys 命令可以查看已生成的密钥对。通过 gpg --keyserver keyserver.ubuntu.com --send-keys 公钥 命令将密钥对发到服务器,供后面验证使用

5. 配置 Maven 的 setting.xml 文件。在 servers 里添加一个 server 块,内容如下:

<server> <id>ossrh</id> <username>jira 账号</username> <password>jira 密码</password> </server>

6. 配置项目的 pom.xml 文件,这里主要是添加了一些插件,测试通过的示例 pom 文件如下。注意:包的 GAV 坐标里的 groupId 一定要跟上面在 jira 申请问题时填写的 Group Id 保持一致,否则无法上传成功

代码语言:javascript
复制
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
		<!--  包信息根据实际填写,groupId 一定要跟上面在 jira 申请问题时填写的 Group Id 保持一致,否则无法上传成功 -->
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <name>...</name>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>
    <dependencies>
    	...
    </dependencies>
&lt;distributionManagement&gt;
    &lt;snapshotRepository&gt;
        &lt;id&gt;ossrh&lt;/id&gt;
        &lt;url&gt;https://s01.oss.sonatype.org/content/repositories/snapshots&lt;/url&gt;
    &lt;/snapshotRepository&gt;
    &lt;repository&gt;
        &lt;id&gt;ossrh&lt;/id&gt;
        &lt;url&gt;https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/&lt;/url&gt;
    &lt;/repository&gt;
&lt;/distributionManagement&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
            &lt;configuration&gt;
                &lt;excludes&gt;
                    &lt;exclude&gt;
                        &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
                        &lt;artifactId&gt;lombok&lt;/artifactId&gt;
                    &lt;/exclude&gt;
                &lt;/excludes&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;

        &lt;plugin&gt;
            &lt;groupId&gt;org.sonatype.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;nexus-staging-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;1.6.7&lt;/version&gt;
            &lt;extensions&gt;true&lt;/extensions&gt;
            &lt;configuration&gt;
                &lt;serverId&gt;ossrh&lt;/serverId&gt;
                &lt;nexusUrl&gt;https://s01.oss.sonatype.org/&lt;/nexusUrl&gt;
                &lt;stagingProgressTimeoutMinutes&gt;20&lt;/stagingProgressTimeoutMinutes&gt;
                &lt;autoReleaseAfterClose&gt;true&lt;/autoReleaseAfterClose&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;
            &lt;version&gt;2.2.1&lt;/version&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;attach-sources&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;jar-no-fork&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-gpg-plugin&lt;/artifactId&gt;
            &lt;version&gt;1.5&lt;/version&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;sign-artifacts&lt;/id&gt;
                    &lt;phase&gt;verify&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;sign&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;

        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;
            &lt;configuration&gt;
                &lt;additionalOptions&gt;
                    &lt;additionalOption&gt;-Xdoclint:none&lt;/additionalOption&gt;
                &lt;/additionalOptions&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;attach-javadocs&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;jar&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;
	&lt;!-- 后面是开发者及项目信息,根据实际填写 --&gt;
&lt;licenses&gt;
    &lt;license&gt;
        &lt;name&gt;BSD 3-Clause&lt;/name&gt;
        &lt;url&gt;https://spdx.org/licenses/BSD-3-Clause.html&lt;/url&gt;
    &lt;/license&gt;
&lt;/licenses&gt;
&lt;scm&gt;
    &lt;connection&gt;...&lt;/connection&gt;
    &lt;url&gt;...&lt;/url&gt;
&lt;/scm&gt;
&lt;developers&gt;
    &lt;developer&gt;
        &lt;name&gt;...&lt;/name&gt;
        &lt;email&gt;...&lt;/email&gt;
        &lt;roles&gt;
            &lt;role&gt;Developer&lt;/role&gt;
        &lt;/roles&gt;
        &lt;timezone&gt;+8&lt;/timezone&gt;
    &lt;/developer&gt;
&lt;/developers&gt;

</project>

7. 上传包

构建成功之后可以先查一下是否发布成功(用 jira 账号登录):https://s01.oss.sonatype.org/#stagingRepositories

成功之后在 jira 创建的问题里会有评论(会有一定延迟),如下图:

8. 到这里就完成了,接下来等着其他各大仓库自动同步(网上说4h,但我实际测试用了接近7h)就可以了。Maven 中央仓库首先可以查到(这个很快,半小时内就可以查到了),然后是我们熟知的https://mvnrepository.com/和其他仓库