将maven项目发布到central repository

2019-12-30 by 没有评论

前言

本文发表日期:2019年12月30日

近期把自己开发的一个工具包发布到了central仓库,记录一下提交流程。

流程

1. 完善pom.xml

1.1. 完善项目信息

通常来说我们项目的pom.xml不会包含完整信息,但是如果要申请发布到central的话就有要求了,通常选填的name,description,url,licences,developers,scm节点都需要填写完整

  • name
    name节点填写项目名称,没有具体要求,但是必须要有。需要注意的是如果项目结构是一个parent pom带若干子项目,每个pom.xml中都需要完善name节点
  • description
    项目描述,可以比name多写一点。只需要在根节点配置
  • url
    我自己填写了项目wiki地址,github地址应该也可以,只需要在根节点配置
  • licences
    开源协议配置,github项目可以在项目主页点击create new file,文件名输入LICENCE.md或者LICENCE.txt,然后会提示选择开源协议模板,根据自己需要选择即可自动创建,不要忘记点提交。添加完LICENCE文件后需要在pom中添加licences节点:
  <licenses>
    <license>
      <name>MIT Licence</name>
      <url>licence file url</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

licence url可以填写github项目的licence文件路径,只需要在根节点配置
– developers
开发者信息,根据实际情况填写即可,只需要在根节点配置

  <developers>
    <developer>
      <name></name>
      <email></email>
    </developer>
  </developers>
  • scm
    项目地址信息,如下格式填写即可,只需要在根节点配置
  <scm>
    <connection>scm:git:https://github.com/foo/proj.git</connection>
    <developerConnection>scm:git:https://github.com/foo/proj.git</developerConnection>
    <tag>master</tag>
    <url>https://github.com/foo/proj.git</url>
  </scm>

注意:使用flatten-maven-plugin的用户要把flattenMode改为ossrhoss,否则打包会自动删除以上信息

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>flatten-maven-plugin</artifactId>
    <version>1.1.0</version>
    <inherited>true</inherited>
    <configuration>
        <updatePomFile>true</updatePomFile>
        <flattenMode>ossrh</flattenMode>
        <outputDirectory>${project.build.directory}/effective-pom</outputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>flatten</id>
            <phase>process-resources</phase>
            <goals>
                <goal>flatten</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1.2. 完善plugins

提交oss要求包含source/javadoc/release plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <phase>package</phase>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <charset>utf-8</charset>
        <encoding>utf-8</encoding>
        <docencoding>utf-8</docencoding>
    </configuration>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <configuration>
        <autoVersionSubmodules>true</autoVersionSubmodules>
        <useReleaseProfile>false</useReleaseProfile>
        <releaseProfiles>release</releaseProfiles>
        <goals>deploy</goals>
    </configuration>
</plugin>

这里有个小坑,javadoc对于注释格式要求比较严格,例如有return的方法一定要@return等,根据报错慢慢排查即可,不过比较难受的是输出的错误信息有乱码

2. 申请groupId

提交到central仓库首先需要申请groupId,而申请groupId的流程在sonatype的Jira系统中,所以首先你需要一个账号

2.1. 注册sonatype账号

访问https://issues.sonatype.org/

如果未登录会要求登录,没有账号可以点Sign Up,表单很简单,这里不做赘述

2.2. 提交issue申请groupId

申请groupId是以issue方式提交,登录成功后点上方的申请按钮,问题类型默认就是new project,概要和描述根据具体情况自行填写,比较重要的就是groupId了,由于这个groupId后面涉及到审核,最好是自己持有的域名,例如yixsoft.com这里就填写com.yixsoft;

后面的project url可以填写github首页地址,scm url需要填写带.git后缀的地址,页面上有例子,很容易填写

提交issue表单

提交后可以得到一个OSSRH ID,这个id记不住也没关系,下次登录进来选择问题->我的报告就能找到。提交后注意关注后面的注释信息,官方会指导下一步处理

2.3. 审核groupId

官方收到申请后会要求审核groupId,如果域名是你自己持有就很好办了,官方推荐的方式就是给域名添加一条TXT记录,内容就是这个issue的OSSRH ID。其他情况见官方信息

配置完成后回复一下要求官方确认。官方确认后就可以把package deploy到oss.sonatype.org了。

当然,我们还有一些额外的东西需要准备

3. 生成并上传gpg key

如果没有gpg软件首先到https://www.gnupg.org/download/ 下载对应操作系统的程序。如果是linux或者mac可以更简单的从软件仓库下载安装,这里不做赘述。

安装完成后执行(部分操作系统可能是gpg2,下同)

gpg --gen-key

创建密钥对,会要求输入name和email

随后执行

gpg --list-key

查看系统中已存在的密钥,找到刚刚生成的条目,里面有一段hex格式的字符串,即key id,复制出来

随后上传密钥对到公钥库,官方使用的公钥库网站有:
– pool.sks-keyservers.net
– keys.gnupg.net
– keyserver.ubuntu.com
如果未生效可以在deploy时看到对应网站的错误日志。根据我的体验,ubuntu应该是最快的了
上传指令:

gpg --keyserver hkp://{domain} --send-keys {keyid}

可以使用如下指令查询公钥是否上传成功,后面可以跟email或者id

gpg --keyserver hkp://{domain} --search-keys ""

4. 配置maven部署过程

4.1. 配置settings.xml

servers节点中新增一个条目,填入sonatype网站注册的username和password

    <server>
      <id>ossrh</id>
      <username></username>
      <password></password>
    </server>

4.2. 配置pom.xml

如果不想每次自动提交可以配置profiles,具体profiles分级不做赘述

4.2.1. properties

            <properties>
                <gpg.executable>gpg</gpg.executable>
                <gpg.keyname></gpg.keyname>
            </properties>

这里的keyname填写刚刚生成的gpg keyid,如果只有一个key可以省略,也可以自行配置default key,executable根据实际情况填写gpg或gpg2

4.2.2. plugins

<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>
<plugin>
    <groupId>org.sonatype.plugins</groupId>
    <artifactId>nexus-staging-maven-plugin</artifactId>
    <version>1.6.8</version>
    <extensions>true</extensions>
    <configuration>
        <serverId>ossrh</serverId>
        <nexusUrl>https://oss.sonatype.org/</nexusUrl>
        <autoReleaseAfterClose>true</autoReleaseAfterClose>
    </configuration>
</plugin>

4.2.3. distribution

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

5. deploy

正常来说执行mvn clean deploy即可提交,先用SNAPSHOT提交测试,正常提交后确认没有问题可以提交到release

首次release提交完成后注意要到sonatype的issue上回复要求确认,对方确认以后过几个小时就可以在mvnrepository.org上搜索到了

Leave a Comment