乐趣区

关于java:个人开源项目如何上传maven中央仓库

最近在写一些开源我的项目,想把本人写的货色放到 maven 地方仓库,提供给更多的人应用。所以写这一篇文章,记录一下自研开源我的项目 jar 包上传同步 maven 地方仓库胜利的整个过程,这其中还是有不少的坑的。
[TOC]

  • 首先须要在 sonatype JIRA 治理平台实现新建我的项目的申请,审核通过之后能力进行上传 jar 的操作
  • 上传过程首先必定是要本地进行打包,为保整我的项目信息完整性及上传过程安全性,须要进行非凡的操作,后文详述
  • 本地打包之后首先传入 sonatype Nexus staging 库,这个库只做长期存储,校验内容残缺、信息残缺之后能力通过平台操作转移到 release 库。
  • 开源我的项目 jar 转到到 release 库之后,实际上须要咱们操作的内容就全都实现了。sonatype maven 库的我的项目会主动同步到 maven 地方仓库,这个过程会有延时,但延时很短。
  • 如果你应用国内的 maven 地方仓库的镜像,与 maven 地方仓库会有比拟大的延时,请急躁期待同步之后,才能够应用。

一、OSSRH 账号注册于配置

sonatype 是由社区反对的开源我的项目托管服务(Open Source Project Repository Hosting,简称 OSSRH),它收费,开发者能够将本人的开源我的项目生成的 maven jar 包托管到这里。当将 maven 我的项目打包部署到这里之后,将主动同步到 maven 地方仓库。 所以不管怎样,咱们都须要先注册一个 sonatype 平台账号。

1.1. 账号注册

注册地址:https://issues.sonatype.org/s…!default.jspa,依照下图所示的内容填写本人的邮箱、全名、登陆用户名 username、登陆密码 passwprd,填写验证码即可实现注册。情谊提醒:注册过程中的明码的强度要求十分高,填写实现之后最好找个记事本把明码先记下来,以面后续应用的时候遗记。另外,注册实现之后,没有任何“注册胜利”相干的提醒,而是间接跳转到登录界面。

应用咱们刚刚注册的用户登陆进去,登陆进去之后会提醒咱们抉择语言:我习惯中文,当然选中文;而后会提醒咱们抉择一个头像;而后会提醒咱们要进行什么工作,“浏览以后我的项目即可”,这一步不重要。

进入 JIRA 治理平台之后,点击顶部导航栏的“新建”按钮,而后在弹出的模态框中填写信息,如下:

  • 我的项目和问题类型,肯定要选对,按图操作
  • 概要内容填写项目名称即可,Group Id 依据我的项目的 maven 坐标按需填写,与 maven 我的项目 pom 配置统一。(这里须要留神:实际操作的时候,先把下文中的《1.2. 域名认证》看完,再做这部操作,存在对应关系防止做错)
  • 代码上传 GitHub 之后的我的项目 URL、scm 版本治理 url(带.git)顺次如图填写。

点击新建即可,新建问题之后。实际上是发动了一个新建我的项目审核的审核工作流,会有人审核你所填写的信息。

1.2. 域名认证

因为上文中 Group ID 我填写的是我本人购买的域名,所以我须要证实这个域名是我的。证实的形式也很简略,就是在我的域名购买的平台,给域名减少一条 txt 的域名解析记录,域名解析记录的值会在 JIRA 平台的流程审核后果记录中给出,如下图中的红色框起来的内容(本次新建我的项目申请的流水编号:OSSRH-83481)。

如果没有域名怎么办?没有域名你能够给 Group Id 填写 github 的用户域,如:com.github.<gihub 用户名 >。填写 github 用户域,验证形式也不一样,须要你在 github 中新建一个空的仓库,仓库的名称是OSSRH-83481

因为我的域名是在阿里云买的,所以我去阿里云为该域名增加一个 TXT 类型的解析记录值。

如果你不太确定 TXT 解析记录值是否失效,能够通过 windows CMD 命令行,响应如下的信息证实设置正确

> nslookup -type=TXT 你的域名
服务器:  dns.google
Address:  8.8.8.8

非权威应答:
你的域名       text =

        "OSSRH-83481"

域名解析记录值增加实现之后,回到 sonatype JIRA 治理平台。在 OSSRH-83481 问题外面如下图所示的地位,有一个 Respose 按钮,点击该按钮证实你曾经实现了域名认证操作。(因为我是操作实现之后,写的这篇文章,所以这个按钮曾经没了,我模仿了一个)

在整个的新建问题,我的项目流程审核过程中,你的注册邮箱会一直的收到 sonatype JIRA 治理平台收回的邮件,提醒你审核流程进行到了什么阶段。(这个审核过程十分迅速,应该是机器人参加的审核,不是人为操作的,我用了 5 分钟就实现了整个审核流程). 审核通过之后,你会看到如下的状态:已解决。

二、装置 GnuPG 软件,并生成签名

新建我的项目审核通过之后,咱们须要在开发 PC 上装置 GnuPG,因为咱们上传到 sonatype maven 库的所有文件都要通过 GnuPG 进行签名,不通过签名的文件无奈上传胜利。下载地址:https://gpg4win.org/thanks-fo…。下载实现之后,傻瓜式的“下一步”“下一步”装置即可。
下载实现之后,咱们关上 windows 的 CMD 命令行,执行如下命令。(留神:我的操作都是在 CMD 命令行上面执行的,不要 power shell,不要 git bash。我都试过,不是不行,是操作过程不统一。如果和我的操作过程不统一,可能导致你操作失败!)

gpg --gen-key

下图中红色的局部是我填写的内容,我的名字、邮箱,以及一个 O 示意 ok。会提醒咱们输出一个 Passphrase,填写 2 遍。这个 Passphrase 就是一个明码,肯定要记住,下文会用到。

GnuPG 签名的公钥私钥对生成实现之后,能够应用如下命令查看后果

C:\Users\hanxt>gpg --list-key
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2024-08-09
C:\Users\hanxt\AppData\Roaming\gnupg\pubring.kbx
------------------------------------------------
pub   ed25519 2022-08-10 [SC] [expires: 2024-08-09]
      6B4F6A477A1BE195326AEAFA0EE41461FB92CD0B
uid           [ultimate] HanXiaotong <hanxiaotongtong@163.com>
sub   cv25519 2022-08-10 [E] [expires: 2024-08-09]

密钥对生成实现之后,将其公钥发往 sonatype 认可的 keyserver,公钥的字符串能够通过上文中的 gpg --list-key 查看到

gpg --keyserver keyserver.ubuntu.com --send-keys 6B4F6A477A1BE195326AEAFA0EE41461FB92CD0B

通过上面的命令行,能够校验公钥的字符串发往服务器是否胜利。

gpg --keyserver keyserver.ubuntu.com --recv-keys 6B4F6A477A1BE195326AEAFA0EE41461FB92CD0B

三、我的项目根底配置

实现上述的筹备工作,咱们要对我的项目进行打包了,打包工具我用的 maven。须要查看如下信息是否配置残缺,如果没有配置残缺,请补充!短少这些信息,maven 我的项目后续将无奈转成 release 状态。请依据本人我的项目的理论状况填写。

<groupId>com.zimug</groupId>
<artifactId>zimug-monitor-threadpool</artifactId>
<version>1.0</version>

<name>${project.groupId}:${project.artifactId}</name>
<description>spring boot starter  for thread pool monitor  </description>
<url>https://github.com/hanxt/zimug-monitor-threadpool</url>

license 中填写开源协定,scm 填写我的项目的 git 代码仓库地址,developer 填写开发人员的联系方式。

  <licenses>
    <license>
      <name>BSD 3-Clause</name>
      <url>https://spdx.org/licenses/BSD-3-Clause.html</url>
    </license>
  </licenses>
  <scm>
    <connection>https://github.com/hanxt/zimug-monitor-threadpool.git</connection>
    <url>https://github.com/hanxt/zimug-monitor-threadpool</url>
  </scm>
  <developers>
    <developer>
      <name>zimug</name>
      <email>hanxiaotongtong@163.com</email>
      <roles>
        <role>Developer</role>
      </roles>
      <timezone>+8</timezone>
    </developer>
  </developers>

四、maven 打包配置

只有在 sonatype JIRA 治理平台上注册的用户,能力将开源我的项目 jar 上传到 sonatype Nexus 仓库。所以咱们在上传 jar 文件的时候,有必要告知服务器端咱们的注册用户名及明码。找到 maven 的 setting.xml, 增加如下配置:

<servers>
    <server>
      <id>ossrh</id> 
      <username>sonatype 注册 username</username>
      <password>sonatype 注册用户的 password</password>
    </server>
</servers>

setting.xml 是针对 maven 进行全局配置,除此之外还须要针对我的项目进行配置 pom.xml,首先配置近程仓库的地址。须要留神的是这里的 id 与 setting.xml 中 sever 配置的 id 要统一。

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

这里有几个须要留神的中央,

  • snapshotRepository 是我的项目快照版本 snapshot 上传地址,如果我的项目的版本号,如:1.0-SNAPSHOT,会上传到这个仓库。
  • 通常状况下 repository 是咱们真正须要公布我的项目的近程仓库上传地址。须要留神的是咱们这里写的是 staging 暂存地址,而不是 release 版本的地址。(为什么这么做?后文详述)
  • 另外须要留神的是,咱们上传的近程仓库的地址是带 s01 前缀的,而比拟旧的文章中不带 s01 前缀。这是因为旧的 sonatype maven 仓库曾经资源满载了,所以官网新建了一个 s01 maven 仓库,将来可能还会有 s02、s03。现阶段在 sonatype JIRA 治理平台上注册的用户,只能上传这个新的 s01 仓库。

近程仓库配置实现之后,咱们还须要针对我的项目 pom.xml 减少一些打包配置,这些配置根本不必批改,原样粘贴进去即可。(其中 maven-gpg-plugin 插件会调用上文中装置的 GnuPG 软件,对文件进行签名)

<profiles>
  <profile>
    <id>release</id>
    <build>
      <plugins>
        <!-- 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>
            <show>private</show>
            <nohelp>true</nohelp>
            <charset>UTF-8</charset>
            <encoding>UTF-8</encoding>
            <docencoding>UTF-8</docencoding>
            <additionalparam>-Xdoclint:none</additionalparam>
            <!-- TODO 长期解决不标准的 javadoc 生成报错, 前面要规范化后把这行去掉 -->
          </configuration>
          <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>
        <!--Compiler -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.0</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <fork>true</fork>
            <verbose>true</verbose>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
        <!--Release -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.1</version>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

在我的项目根目录下,运行上面的命令进行 maven 打包操作(同时将我的项目 jar deploy 到近程 maven 仓库),在打包运行过程中,会弹出一个对话框提醒你输出密钥(Passphrase),输出上文《装置 GnuPG 软件,并生成签名》章节中你填写的 Passphrase 即可。

mvn clean install deploy -P release 

这里须要留神的是:

  • 不要应用 IDEA 的 maven UI 打包,IDEA 的 maven UI 打包会报错,无奈执行 gpg 命令。至于具体起因我也没搞清楚,应用上文中的 CMD 命令行打包即可。
  • 应用 mvn 命令行打包的时候,须要留神你的 JAVA_HOME 环境变量的指向,是不是你冀望的版本。我的电脑上装置了多个版本的 JDK,JAVA_HOME 指向的是 JDK11,而我心愿打包的版本是 JDK8。有可能造成凌乱!
  • 如果 maven depoly 发布命令报 401 authentication 谬误,是因为你的 maven 的 setting.xml 的 server 配置的用户名明码谬误,或者 setting.xml 的 server 配置 id 与 pom 外面配置的 repository id 不统一导致的。也有可能你的电脑上 maven 多个版本,我的项目应用的不是同一个 setting.xml。
  • 如果报 400 谬误,很有可能是你曾经上传过的 jar,同一个版本再次反复上传了。

五、CLOSE&RELEASE

我的项目 jar 正确的上传到 nexus repository 仓库之后,咱们还须要进行进一步的操作。这是因为咱们上传的 jar 放入了 staging 暂存库外面,咱们须要把它转到 release 库,这其中 sonatype 平台会针对你的我的项目信息、jar 文档、源码等内容进行完整性校验,完整性校验不通过的我的项目是无奈转到 release 的,也就无奈同步到 maven 地方仓库。

这些操作须要咱们通过界面进行,应用 sonatype 注册用户进行登录:https://s01.oss.sonatype.org/。如图所示,如果咱们我的项目打包上传胜利,会在 Staging Repository 外面看到一个 Repository,将其勾选。点击“CLOSE”按钮之后,会主动进行完整性校验,校验后果能够双击勾选仓库所在行进行查看。(只有依照我上文中的内容,将 pom 中的我的项目信息以及打包配置填写残缺,这里根本都会校验通过)

CLOSE 校验通过之后,刷新几次页面,Release 按钮就变成可点击的状态。此时点击 Release 按钮,就将我的项目 jar 从 Staging 暂存库,转移到了 Release 正式库。实际上须要咱们操作的内容就全都实现了。

sonatype maven 库的我的项目会主动同步到 maven 地方仓库,通过 maven 坐标引入应用即可,不要焦急,这个过程可能会有一些延时。上传之后可能一段时间内无奈在 maven 地方仓库搜寻到,然而应用 maven 坐标下载 jar 包也没有问题。

所有都 ok 之后,最好回到 sonatype JIRA 治理平台将“问题”敞开,这样 sonatype JIRA 治理流程就全副实现了。

欢送关注我的布告号:字母哥杂谈,回复 003 赠送作者专栏《docker 修炼之道》的 PDF 版本,30 余篇精品 docker 文章。字母哥博客:zimug.com

退出移动版