记一次完整的Maven中央仓库发布过程

《记一次完整的Maven中央仓库发布过程》
网上文章不少,不过还是踩了一些坑,这里记录一下:

工具和资料

创建新项目

  1. Maven中央仓库是由Sonatype维护的,因此需要到他们的JIRA系统,用类似报Bug的方式创建新项目
  2. 首先访问Sonatype的JIRA系统,注册一个账号,地址为 https://issues.sonatype.org/s…
  3. 记好自己在Sonatype上的账号密码,后面需要添加到maven的settings.xml中
  4. 点”Create”按钮,创建一个新的Issue,默认的Issue Type就是New Project,不要改变,依次填好下面的星标部分
  5. 这时候Github上的项目地址、SCM地址(也就是git地址)应该已经确定了;GroupId建议直接用”com.github.用户名”,否则需要验证你对域名的所有权
  6. 创建的Issue是需要审核的,当其状态变为Resolved状态,就可以进行项目上传了

创建GPG密钥并上传

  1. Maven中央仓库要求使用GPG密钥对上传的Jar包进行数字签名,因此这一步不可缺少
  2. 我的电脑安装了Windows版Git,里面自带gpg.exe,但是需要先把gpg.exe所在目录加入到PATH环境变量中,比如我的电脑中是D:devGitusrbin,注意和git.exe不在同一个目录。也可以参考其他人的流程使用界面工具创建。
  3. 打开命令行窗口,执行gpg –gen-key,按照提示输入信息,具体见下面的参考“GPG密钥的生成与使用”
  4. 记好私钥的密钥,后面会把它添加到Maven的settings.xml中
  5. 密钥生成之后把你的公钥需要上传到公钥服务器,公钥服务器之间会自动同步

    • 列出你的密钥 gpg –list-secret-keys 输出中pub一行’/’后的8位HEX字符串就是密钥ID
    • 上传到服务器 gpg –keyserver keyserver.ubuntu.com –send-keys <密钥ID>
    • 验证上传结果 gpg –keyserver keyserver.ubuntu.com –recv-keys <密钥ID>

修改Maven的settings.xml文件

  • 在<servers>标签中添加Sonatype登录信息。Maven发布jar包时需要使用。
    <server>
      <!-- https://issues.sonatype.org/secure/Dashboard.jspa -->
      <id>ossrh</id>
      <username>你的Sonatype账户</username>
      <password>你的Sonatype密码</password>
    </server>
  • 在<profiles>标签中添加GPG的可执行文件名和私钥密码。maven-gpg-plugin插件运行时需要使用。
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg.exe</gpg.executable>
        <gpg.passphrase>GPG私钥密码</gpg.passphrase>
      </properties>
    </profile>

修改项目的pom.xml文件

  • 根据中央仓库发布要求(见参考),pom中需要提供必要的项目信息,以下元素缺一不可,否则无法发布:

    • modelVersion
    • groupId
    • artifactId
    • version
    • packaging
    • name
    • description
    • url
    • licenses.license
    • developers.developer
    • scm.connection
    • scm.url
  • 需要提供源码jar包和javadoc jar包,并使用gpg签名,因此必须添加相应maven plugin
  • 需要添加distributionManagement以自动上传到Sonatype
  • 下面是一个完整pom示例
<?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>com.github.rockswang</groupId>
  <artifactId>java-curl</artifactId>
  <version>1.2.0</version>
  <packaging>jar</packaging>

  <parent>
    <groupId>org.sonatype.oss</groupId>
    <artifactId>oss-parent</artifactId>
    <version>7</version>
  </parent>

  <name>java-curl</name>
  <description>Ultra-lightweight CURL implementation in pure java 1.6</description>
  <url>https://github.com/rockswang/java-curl</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!--Compiler-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <!-- Source -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.2.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>2.9.1</version>
        <configuration>
          <additionalparam>-Xdoclint:none</additionalparam><!-- 添加这个压制JavaDoc检查 -->
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- GPG mvn clean deploy -P release -Dgpg.passphrase=YourPassphase -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <version>1.5</version>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo,manual</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Rocks Wang</name>
      <email>rockswang@foxmail.com</email>
      <organization>roxstudio</organization>
      <url>https://github.com/rockswang</url>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:https://github.com/rockswang/java-curl.git</connection>
    <developerConnection>scm:git:https://github.com/rockswang/java-curl.git</developerConnection>
    <url>https://github.com/rockswang/java-curl</url>
    <tag>1.2.0</tag>
  </scm>

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

</project>

构建和上传

  • 在项目根目录命令行运行 mvn clean deploy verify
  • 若代码正确,配置正常,到这一步构建完即可自动打包并上传到Sonatype的Staging仓库
  • 注意:如果发布正式版本则不要在版本号上添加-SNAPSHOT,否则会被上传到Snapshot仓库

发布并同步到中央仓库

  • 打开Sonatype仓库管理页面 https://oss.sonatype.org/,使用前面的Sonatype账户密码登录
  • 点击左面菜单中的Staging Repositories,在右面的列表中拉到最下面,就能找到自己刚上传的项目,选中它,点击Close
  • 注意点击Close之后,服务器会按照“中央仓库发布要求”逐项验证你的包是否符合规格,大概需要1分钟左右。如果close失败了,点击下部面板的Activity子面板,查看失败原因,然后重新close。
  • 成功Close之后,选中项目,点Release。发布后,项目会自动从Staging列表中删除。
  • 回到Sonatype的JIRA系统中,找到你的issue,加条备注告诉工作人员你已经成功发布了,他们会帮你激活同步过程。只有首次提交需要这个步骤。
  • 同步到中央仓库可能需要几个小时,过段时间再去中央仓库搜索吧。

参考

别人的流程:https://blog.csdn.net/liuhuan…
别人踩的坑:https://blog.csdn.net/h324321…
GPG密钥的生成与使用 https://www.jianshu.com/p/7f1…
中央仓库发布要求:https://central.sonatype.org/…

    原文作者:rockswang
    原文地址: https://segmentfault.com/a/1190000017041706
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞