Skip to content

Maven 发布 jar 到中央仓库

官方文档:https://central.sonatype.org/register/central-portal/

注册账号

链接:https://central.sonatype.com/

新建命名空间

登录系统后,点击【Publish】->【Namespace】->【Add Namespace】

  • 可以按照下面的要求来创建:
    • GitHub:io.github.myusername
    • GitLab:io.gitlab.myusername
    • Gitee:io.gitee.myusername
    • Bitbucket:io.bitbucket.myusername

可参考:https://central.sonatype.org/register/namespace/

验证命名空间

需要验证命名空间来证明这个命名空间是你独有的,需要在对应的地址(如:Github)创建一个开源的仓库,名称就是你点击【Verify Namespace】的名称。

在按钮【Verify Namespace】那里,会有一个名称类似【io.github.test】的仓库,在地址(如:Github)中创建一个同名的仓库,然后点击【Verify Namespace】,等待验证成功。

创建 push 的账号和密码

登录系统后,点击右上角的【View Account】,点击【Generate User Token】,点击【ok】,生成 username 和 password。

注意:只会在生成的时候显示一次,请保存好。

设置 settings.xml

把上面生成的 username 和 password 填入 settings.xml 中(增加一个 server 节点),如下:

xml
<servers>
    <server>
        <id>central</id>
        <username>NxG643</username>
        <password>nQheMlinuaWHaALc78m23XGGJH3gCHH8a4</password>
    </server>
</servers>

注意: <id>central</id>:为仓库的 id。 可以是任意值,但需要和 pom.xml 中 central-publishing-maven-plugin 插件配置的 publishingServerId 保持一致。

下载并安装 GPG 工具

GPG 用于创建 asc 文件用于验证你的文件的正确性和安全性。

下载地址:https://gnupg.org/download/index.html

找到 GnuPG binary releases,下面有 windows 版本的 Gpg4win(如:gpg4win-4.4.1.exe), 及其它操作系统的版本。

双击安装 gpg4win-4.4.1.exe。

在安装目录找到 Kleopatra.exe 工具,双击打开。

  • 创建 GPG 密钥对。点击【文件】->【新建密钥对】->【创建个人 OpenPGP 密钥对】。
  • 填写名称和邮箱(邮箱应该是可选的,如需要可填写中央仓库账号的邮箱),【高级设置】中可修改有效期。
  • 设置 passphrase:勾选使用密码句保护生成的密钥。确认。
    • 填写 passphrase。自己想一个密码,如:12345678
  • 在服务器上发布。创建完成确认后,在 Kleopatra 中选中刚才创建的密钥对,并右键选择在服务器上发布。
  • 配置 MAVEN_GPG_PASSPHRASE 环境变量:MAVEN_GPG_PASSPHRASE=<passphrase>
    • maven 中 maven-gpg-plugin 插件会自动读取系统环境变量中的 MAVEN_GPG_PASSPHRASE。

注意:如果创建密钥对时,忘记勾选使用密码句保护生成的密钥, 可以右键选择【更改密码句】,然后填写 passphrase。

pom.xml 配置

至少需要以下 maven 插件。

xml
<plugins>
    <plugin> 
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-source-plugin</artifactId>
        <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>
        <executions>
            <execution>
                <id>attach-javadocs</id>
                <phase>package</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <!-- 禁用严格的文档检查 -->
            <doclint>none</doclint>
        </configuration>
    </plugin>  
    <!-- GPG
        1. 需要安装 gpg4win-4.4.1.exe,并创建要给 OpenPGP 密钥对证书(邮箱填写中央仓库账号的邮箱),勾选`使用密码句保护生成的密钥`复选框,输入 passphrase 保存,并右键【在服务器上发布】。
        2. 配置系统环境变量:MAVEN_GPG_PASSPHRASE=<证书的 passphrase>
    -->
    <plugin> 
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-gpg-plugin</artifactId>  
        <version>${maven-gpg-plugin.version}</version>
        <executions>
            <execution>
                <!-- 在 Maven 生命周期的 verify 阶段触发签名操作。该阶段位于 package 之后、install 之前,适合进行签名验证。 -->
                <phase>verify</phase>
                <goals>
                    <!-- 调用插件的 sign 目标,对已打包的 artifacts(如主 JAR、源码 JAR、POM 文件等)进行签名。 -->
                    <goal>sign</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <!-- 需要在 settings.xml 中配置 <server><id>central</id> ......其他配置 </server>           -->
    <plugin>
        <groupId>org.sonatype.central</groupId>
        <artifactId>central-publishing-maven-plugin</artifactId>
        <version>${central-publishing-maven-plugin.version}</version>
        <extensions>true</extensions>
        <configuration>
            <publishingServerId>central</publishingServerId>
            <autoPublish>true</autoPublish>
            <waitUntil>validated</waitUntil>
        </configuration>
    </plugin>
</plugins>

mvn deploy

运行 mvn deploy 命令,会自动打包、签名、验证并发布到中央仓库。