提交构件到Maven中央库的实操

1、注册Sonatype的账户

访问https://issues.sonatype.org/secure/Signup!default.jspa 注册一个Sonatype账号。

2、提交发布申请

提交申请,在这里是创建一个issue的形式 创建地址:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

在填写issue信息的时候,有一些需要注意的地方:

  • “group id”就是别人在使用你的构件的时候在pom.xml里面进行定位的坐标的一部分,而且尽量应该是你的站点的url倒序,参考java包命名的规范,有时候工作人员会想你确认你是否是这个站点url的拥有者,这里由于我已经购买了songxinqiang.cn域名的所有权,所以我填写的就是“cn.songxinqiang”

  • “project url”这个是项目的站点,一般是用作说明的

  • “SCM url”这个构件的源代码的url,便于别人查看源代码,当然这个得是公网能够访问的,不要是什么内部的svn地址什么的。

其他的就没有什么了,提交之后就等工作人员离开确认吧,有时候工作人员会问你些你没有明确的内容,只需要回答就好。需要注意的是,这个系统的工作人员是在美国上班的,经过我的等待和观察,他们会在北京时间的22:00开始上班、处理issue,所以在这个时间之前就不要去查询状态了,人家还没有上班呢(我会告诉你,我在上午9:00左右提交了,每个半小时查看一次直到工作人员回复我吗)。 等到工作人员在你创建的issue下面回复你说“配置已经修改……”(还有几个链接)的时候就说明审批已经通过了,你就可以进行构件的上传了。

参考: Alt text

由于之前已经使用了io.github.Feiyizhan这个Group ID发布过一个构建,因此官方建议在之前的issue上继续操作。 Alt text

3、使用 GPG 生成密钥对

如果之前已经生成过,该步骤可以跳过

下载密钥生成工具

如果是 Windows 操作系统,需要下载 Gpg4win 软件来生成密钥对。建议大家下载 Gpg4win-Vanilla 版本,因为它仅包括 GnuPG,这个工具才是我们所需要的。 安装 GPG 软件后,打开命令行窗口,依次做以下操作:

  • 查看是否安装成功
gpg --version

能够显示 GPG 的版本信息,说明安装成功了。

  • 生成密钥对
gpg --gen-key

此时需要输入姓名、邮箱等字段,其它字段可使用默认值,此外,还需要输入一个 Passphase,相当于一个密钥库的密码,一定不要忘了,也不要告诉别人,最好记下来,因为后面会用到。

  • 查看公钥
gpg --list-keys

输出如下信息:

------------------------------------------------
pub   rsa2048 2018-11-26 [SC] [expires: 2020-11-26]
      06BA333117D82729CB4CE1416B60F9B3DE37A454
uid           [ultimate] XuMingLong <xmlde@vip.qq.com>
sub   rsa2048 2018-11-26 [E] [expires: 2020-11-26]

可见这里的公钥的 ID 是:06BA333117D82729CB4CE1416B60F9B3DE37A454,很明显是一个 16 进制的数字,马上就会用到。

  • 将公钥发布到 PGP 密钥服务器
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 06BA333117D82729CB4CE1416B60F9B3DE37A454

此后,可使用本地的私钥来对上传构件进行数字签名,而下载该构件的用户可通过上传的公钥来验证签名,也就是说,大家可以验证这个构件是否由本人上传的,因为有可能该构件被坏人给篡改了。

  • 查询公钥是否发布成功
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 06BA333117D82729CB4CE1416B60F9B3DE37A454

实际上就是从 key server 上通过公钥 ID 来接收公钥,此外,也可以到 pool.sks-keyservers.net 上通过公钥 ID 去查询。

查询结果:

gpg: key 6B60F9B3DE37A454: "XuMingLong <xmlde@vip.qq.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

网页查询结果: https://keyserver.2ndquadrant.com/pks/lookup?search=xmlde%40vip.qq.com&op=vindex Alt text

4、 修改 Maven 配置文件

需要修改的 Maven 配置文件包括:setting.xml(全局级别)与 pom.xml(项目级别)。

setting.xml

<settings>

...

	<servers>
		<server>
			<id>oss</id>
			<username>用户名</username>
			<password>密码</password>
		</server>
	</servers>

...

</settings>

使用自己注册的 Sonatype 账号的用户名与密码来配置以上 server 信息。

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>io.github.Feiyizhan</groupId>
    <artifactId>id-validator</artifactId>
    <version>1.0</version>
    <name>id-validator</name>
    <description>中华人民共和国居民身份证、中华人民共和国港澳居民居住证以及中华人民共和国台湾居民居住证号码验证工具</description>
    <url>https://github.com/Feiyizhan/id-validator</url>
    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.9</maven.compiler.source>
        <maven.compiler.target>1.9</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- Lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>


        <!-- Apache commons-lang -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.10.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.10.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9.1</version>
        </dependency>
    </dependencies>

    <licenses>
        <license>
            <name>MIT License</name>
            <url>https://opensource.org/licenses/MIT</url>
        </license>
    </licenses>

    <developers>
        <developer>
            <name>xuminglong</name>
            <email>xmlde@vip.qq.com</email>
        </developer>
    </developers>

    <scm>
        <connection>scm:git:https://github.com/Feiyizhan/id-validator.git</connection>
        <developerConnection>scm:https://github.com/Feiyizhan/id-validator.git</developerConnection>
        <url>https://github.com/Feiyizhan/id-validator.git</url>
    </scm>

    <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- Source -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.0.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- Javadoc -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>3.0.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- GPG -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.6</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>


</project>

5、 执行发布操作

命令行方式

待构件编写完成,就可以进行上传、发布了。在命令行进入项目pom.xml所在路径,执行:

mvn clean deploy -P release

IDE 方式

在IDEA 选择项目,新增run 配置,配置如下:

Alt text

弹出框,输入生成密钥时设置的密码:

Alt text

处理成功的结果 Alt text

发布构件

在https://oss.sonatype.org/ “close”并“release”构件;

Alt text

注:后续更新版本也需要重复该步骤

附录

查询构件发布情况:https://oss.sonatype.org/

如果生成时一直提示等待锁定gnupg_spawn_agent_sentinel.lock文件,可能是其他Gpg进程锁定了该文件,需要手动找到Gpg进程杀掉即可。