将自己的 jar 包发布到 maven 中央仓库

注册

首先到sonatype官网进行注册!

找到注册“sign up”,如图,进行注册!

登录

登录后,在页面上方点击“create”进行创建 issue。

获得如下图所示。

  • Summary:写你想做什么,你的包的功能。简单概述,要短一点。
  • Description:可以直接复制 summary,然后加一点描述信息。
  • Group Id :推荐写 github。例如我的是 io.github.dslzc ,很快能通过,自己域名的话我没试过,虽然我有自己的域名。
  • Project UR : 你的项目的描述,填写你的项目的 github 地址就可以了。
  • SCM url: 有填写说明的,如https://github.com/DSLZC/dslcode-common-utils.git。
  • Username(s):邀请其他人有权限一起完成这个项目。我当时没填。

等待 Issue 审批通过

网上说需要一天到两天。为何我这一步是秒过的。大概 20 秒过后我就接收到通过邮件了。或许是我填写的 github 比较好认真真实性。

配置 GPG

如果是 Windows 操作系统,需要下载 Gpg4win 软件来生成密钥对。建议大家下载 Gpg4win-Vanilla 版本,因为它仅包括 GnuPG,这个工具才是我们所需要的。

安装 GPG 软件后,打开命令行窗口,依次做以下操作:

  1. 查看是否安装成功

gpg --version

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

  1. 生成密钥对

gpg --gen-key

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

  1. 查看公钥

gpg --list-keys

如下:

D:\IdeaProjects\ScriptSpider>gpg --list-keys
pub   rsa2048 2018-01-10 [SC] [expires: 2020-01-10]
      E7135ADD7985270EC66E0B2F735A5D90291062B9
uid           [ultimate] dongsilin <[email protected]>
sub   rsa2048 2018-01-10 [E] [expires: 2020-01-10]

我的公钥是:E7135ADD7985270EC66E0B2F735A5D90291062B9

  1. 将公钥发布到 PGP 密钥服务器

gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys E7135ADD7985270EC66E0B2F735A5D90291062B9

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

  1. 查询公钥是否发布成功

gpg --keyserver hkp://pool.sks-keyservers.net:11371 --recv-keys E7135ADD7985270EC66E0B2F735A5D90291062B9

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

修改 Maven 配置文件

...     
 <servers>     
     <server>         
     <id>dslcode</id>  // 这里要和后面呼应        
     <username>dslcode</username>    // 登录sonatype的用户名         
     <password>**********************</password>   // 登录sonatype的密码   
     </server>   
 </servers>     
 ...

修改你工程的 pom 文件

你可以增加你自己其他的,这个是我当时的 pom。

   <groupId>io.github.dslzc</groupId>
   <artifactId>dslcode.common.utils</artifactId>
   <version>0.0.1</version>
   <packaging>jar</packaging>

   <name>Java-Common-Utils</name>
   <description>我的常用工具包 Java Common Utils</description>
   <url>https://github.com/DSLZC/dslcode-common-utils</url>

   <licenses>
      <license>
         <name>The MIT License (MIT)</name>
         <url>http://www.opensource.org/licenses/mit-license.html</url>
         <distribution>repo</distribution>
      </license>
   </licenses>

   <developers>
      <developer>
         <name>****</name>
         <email>****@foxmail.com</email>
      </developer>
   </developers>

   <scm>
      <connection>scm:git:https://github.com/DSLZC/dslcode-common-utils.git</connection>
      <developerConnection>scm:git:https://github.com/DSLZC/dslcode-common-utils.git</developerConnection>
      <url>https://github.com/DSLZC/dslcode-common-utils</url>
   </scm>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>

      <spring.version>4.3.3.RELEASE</spring.version>
      <aspectj.version>1.8.9</aspectj.version>
      <servlet.version>3.1.0</servlet.version>
      <javax.validation.version>1.1.0.Final</javax.validation.version>
      <fasterxml.version>2.8.1</fasterxml.version>
      <commons.io.version>2.4</commons.io.version>
      <dom4j.version>1.6.1</dom4j.version>
      <dozer.version>5.5.1</dozer.version>
      <lombok.version>1.16.10</lombok.version>
      <joda.time.version>2.9.4</joda.time.version>
      <apache.poi.version>3.14</apache.poi.version>
      <thumbnailator.version>0.4.8</thumbnailator.version>
   </properties>

   <dependencies>
      ************
   </dependencies>

   <build>
      <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <addMavenDescriptor>true</addMavenDescriptor>
                        <index>true</index>
                        <manifest>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.10.1</version>
                <executions>
                    <execution>
                        <id>attach-javadoc</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                  <configuration>
                     <additionalparam>-Xdoclint:none</additionalparam>
                  </configuration>
               </execution>
                </executions>
                <configuration>
                    <show>public</show>
                    <charset>UTF-8</charset>
                    <encoding>UTF-8</encoding>
                    <docencoding>UTF-8</docencoding>
                    <failOnError>false</failOnError>
                    <!--<excludePackageNames>com.dslcode.*</excludePackageNames>-->
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-gpg-plugin</artifactId>
                <executions>
                    <execution>
                        <id>sign-artifacts</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>sign</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
      </plugins>
   </build>

    <distributionManagement>
        <snapshotRepository>
            <id>dslcode</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </snapshotRepository>
        <repository>
            <id>dslcode</id>
            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>

</project>

上传构件到 OSS 中

mvn clean deploy -Dmaven.test.skip=true -Dgpg.passphrase=************ 

有时候会弹出来让你输入Passphase 密码,Passphase 就是 GPG 密钥对的密码,只有自己才知道。在之前的步骤中已经告诉你要牢记了。

随后会看到大量的 upload 信息,而且速度比较慢,如果出现 timeout,需要反复尝试。

在 OSS 中发布构件

打开https://oss.sonatype.org,使用自己的 Sonatype 账号登录后,点击左侧的 Staging Repositories ,在最下方可以看到刚才已上传的构件,或者搜索自己的构件。

这些构件目前是放在 Staging 仓库中,可进行模糊查询,快速定位到自己的构件。

此时,该构件的状态为 Open,需要勾选它,然后点击 Close 按钮。

接下来系统会自动验证该构件是否满足指定要求,当验证完毕后,状态会变为 Closed。

如果检查出现问题,会有详细的记录,需要把改构件Drop,解决问题后再重新deploy。

最后,点击 Release 按钮来发布该构件。

通知 Sonatype“构件已成功发布”

需要在曾经创建的 Issue 下面回复一条“构件已成功发布”(Hi,my component has been successfully published.thanks!)的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后工作人员会关闭该 Issue。

我的 issue 展示

通过该截图,你应该知道我们都做了什么。

如果是发布的话,请注意 artifactId 不能是 -SNAPSHOT

因为从截图看(经过证明),一旦你的 issue 第一次被批准,你就可以发布-SNAPSHOT了,而且我当时尝试了使用我的-SNAPSHOT版本的 jar,并不需要进行后续操作。

等待构件审批通过

没错,还是要等,我大概等了一个多小时吧。看我的邮件列表的回复。意思大概是 10 分钟就可以使用了,2 小时才能被搜索到。我猜用镜像的应该更慢,需要同步的。感觉他们的效率还是很高,没有我查到的别人用一到两天。

最后,就可以到中央仓库中搜索到自己发布的构件了!中央仓库搜索网站:http://search.maven.org/

第一次之后

你就可以安心的开车了 ~

以后的发布流程是:

  1. 构件准备好之后,在命令行上传构建

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

  3. 等待同步好(大约 2 小时多)之后,就可以使用了。

OK,准备下车啦!!!!!!!

猜你喜欢

转载自my.oschina.net/u/2919251/blog/1605264