摘要

Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Maven ,本文详细记录整个发布、同步过程。

注册一个 Sonatype 用户

进入地址:https://issues.sonatype.org/secure/Signup!default.jspa 注册 Sonatype 用户,Sonatype 通过 JIRA(JIRA 是 Atlassian 公司出品的项目与事务跟踪工具)来管理 OSSRH 仓库。

创建一个发布构件的 issue

提交「构件发布申请」的第一步是在 JIRA Dashborad 上创建一个 issue。如下所示,点击 Create 按钮:

会弹出一个对话框让你填写 issue 的详细信息,这里最重要的就是 Group Id,一般会带上域名,千万别弄错了,这关系到以后发布其它的构件。我们这里是com.vesoft

Sonatype 有域名验证,验证方式:

  • 往你的 DNS 中添加 JIRA 编号记录
  • 重定向到你的 Github 主页

如果你没有域名,可参考这个链接:http://central.sonatype.org/pages/choosing-your-coordinates.html 的方法进行操作

  • 选择一个带有项目托管信息的 GroupId,例如 io.github.facebook 或 com.github.facebook
  • 另外一种推荐的方式是使用免费的 free managed security reporting service

等待 issue 审核通过

审核因为时差原因需要一定时间,审核通过后会收到邮件通知,同时在对应 issue 下会看到 Sonatype 工作人员的回复,一般是添加一个 comment,内容大致如下:

Configuration has been prepared, now you can:

Deploy snapshot artifacts into repository https://oss.sonatype.org/content/repositories/snapshots

Deploy release artifacts into the staging repository https://oss.sonatype.org/service/local/staging/ deploy/maven2

Promote staged artifacts into repository 'Releases'

Download snapshot and release artifacts from group https://oss.sonatype.org/content/groups/public

Download snapshot, release and staged artifacts from staging group https://oss.sonatype.org/content/groups/staging

please comment on this ticket when you promoted your first release, thanks

使用 GPG 生成密钥对

生成密钥对

> gpg --gen-key

会让选择加密方式:

  • RSA and RSA (default)
  • DSA and Elgamal
  • DSA (sign only)
  • RSA (sign only)

默认选第一个,选择之后,需输入用户名和邮箱,和 Passphase——相当于密钥库密码。

查看公钥

> gpg --list-keys

xxx/.gnupg/pubring.gpg
---------------------------------
pub 2048R/xxxx 2019-12-02
uid $YOUR_UID <$YOUR_EMAIL>
sub 2048R/**** 2019-12-02

这里的公钥 ID 是 xxxx,马上就会用到了。

将公钥上传到 PGP 密钥服务器

gpg --keyserver hkp://keys.gnupg.net:11371 --send-keys xxxx

查看公钥是否上传成功

> gpg --keyserver hkp://keys.gnupg.net:11371 --recv-keys xxxx

gpg: 下载密钥‘xxxx’,从 hkp 服务器 keys.gnupg.net
gpg: 密钥 xxxx:“$YOUR_UID <$YOUR_EMAIL>”未改变
gpg: 合计被处理的数量:1
gpg: 未改变:1

NOTE:

  • 根据实际填写此处的公钥 ID
  • 很多网上教程给的是  pool.sks-keyservers.net,个人感觉 pool.sks-keyservers.net 这个 keyserver 不好用,上传了 key,经常会验证失败,也获取失败,maven 支持两个 key servers http://keys.gnupg.net:11371http://pool.sks-keyservers.net:11371
  • 此处采用 hkp 协议而不是 http 协议
  • 很多教程没有给端口,经试验,需加上端口号

本地的私钥用来对上传的构件进行数字签名,而下载该构件的用户可通过上传的公钥来验证签名--需验证这个构件是否由本人上传的,因为存在构件被篡改的可能。

修改 Maven 配置文件

修改 Maven 配置文件主要是需要修改 setting.xml 和项目的 pom.xml 文件

配置 Maven 的 setting.xml

修改 ~/.m2/setting.xml 文件

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
...
<server>
<id>snapshots</id>
<username>$USER_NAME</username>
<password>$YOUR_PASSWORD</password>
</server>
<server>
<id>release</id>
<username>$USER_NAME</username>
<password>$YOUR_PASSWORD</password>
</server>
</servers> </settings>

替换 USER_NAME , YOUR_PASSWORD 为 Sonatype 上面注册的用户名和密码, 这里的 ID 会在 pom.xml 里面使用到。

配置 Maven 的 pom.xml

<project>
... <!-- More Project Information -->
<name>nebula-java</name>
<description>Nebula Java Client</description>
<url>https://github.com/vesoft-inc/nebula-java</url>
<scm>
<connection>scm:git:https://github.com/vesoft-inc/nebula</connection>
<url>https://github.com/vesoft-inc/nebula</url>
<developerConnection>scm:git:https://github.com/vesoft-inc/nebula</developerConnection>
</scm>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>license</comments>
</license>
</licenses> ...
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<!-- Source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<excludePackageNames>com.facebook.thrift:com.facebook.thrift.*</excludePackageNames>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<doclint>none</doclint>
</configuration>
</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>
</plugins>
</build>
<distributionManagement>
<repository>
<id>release</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
</profile>
</profiles>
...
</project>
  • pom.xml 中必须包括: name 、 description 、 url 、 licenses 、 developers 、 scm 等基本信息 (血泪史之踩过的坑)
  • 发布 maven 除了 jar 必须还有文档包和源码包。因此 pom 需添加 maven-javadoc-plugin  和  maven-source-plugin 。 参考示例:
com-vesoft-client
|-- pom.xml
|-- src\
`-- target
`-- attach-source-javadoc-1.0-SNAPSHOT.jar
`-- attach-source-javadoc-1.0-SNAPSHOT-javadoc.jar
`-- attach-source-javadoc-1.0-SNAPSHOT-sources.jar
  • 发布构建需要秘钥加密,因此 pom 需添加 maven-gpg-plugin  (血泪史之踩过的坑)

多模块项目配置

nebula-java 是多模块项目

<modules>
<module>client</module>
<module>examples</module>
</modules>

为了上传 Client,需要上传 parent 的 pom.xml,否则 Client 会找不到依赖(血泪史之踩过的坑),但我们又不希望上传 examples 模块,故做了如下改动:

  • 项目信息 namedescriptionurllicensesdevelopersscm 等信息和 maven-gpg-plugin 放在 parent 的 pom.xml 文件中
<project>
...
<name>nebula-java</name>
<description>Nebula Java Client</description>
<url>https://github.com/vesoft-inc/nebula-java</url>
<scm>
<connection>scm:git:https://github.com/vesoft-inc/nebula</connection>
<url>https://github.com/vesoft-inc/nebula</url>
<developerConnection>scm:git:https://github.com/vesoft-inc/nebula</developerConnection>
</scm>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>license</comments>
</license>
</licenses> <developers>
<developer>
<id>$ID</id>
<name>$NAME</name>
<email>$EMAIL</email>
<organization>vesoft</organization>
<roles>
<role>architect</role>
<role>developer</role>
</roles>
</developer>
</developers> <distributionManagement>
<repository>
<id>release</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement> <build>
<plugins>
<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>
</plugins>
</build>
</project>
  • 在 Java Client 的 pom.xml 中添加 maven-javadoc-plugin  、  maven-source-plugin 和 maven-deploy-plugin
<plugins>
......
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<excludePackageNames>com.facebook.thrift:com.facebook.thrift.*</excludePackageNames>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<doclint>none</doclint>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
</execution>
</executions>
</plugin>
</plugins>

在 example 模块的 pom.xml 中声明 skip deploy

<plugins>
......
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>

Q: 为什么 maven-gpg-plugin 放在 parent 的 pom.xm l中,而 maven-javadoc-pluginmaven-source-plugin 插件放在 Client 的 pom.xml 中

A: 因为上传的所有构件都需要加密,包括 parent 的 pom.xml,因此放在 parent 中; 而只有 Client 需要上传 javadoc,source,因此 maven-javadoc-pluginmaven-source-plugin 插件放在 Client 中。

上传构件到 OSS 中

在 nebula-java/ 目录下运行:

> mvn clean deploy -DpomFile=pom.xml

NOTE:不加 -DpomFile ,上传的文件中会没有 parent 的 pom.xml (又是一部血泪史)

在 OSS 中发布构件

使用 Sonatype 账号登录 https://oss.sonatype.org/#stagingRepositories,可在 Staging Repositories  中查看已上传的构件,这些构件目前是放在 Staging 仓库中,可进行模糊查询,定位到刚上传的构件。

此时,该构件的状态为 Open ,勾选它,然后点击 Close  按钮。系统会自动验证该构件是否满足指定要求 (幸福的人只有一种,不幸的人各有各的不幸,可能会遇到各种各样的不符合要求,Good luck!ヾ(◍°∇°◍)ノ゙)

当验证完毕后,状态会变为 Closed

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

页面可能要刷新一下才能看到最新的状态。

通知 Sonatype 构件已成功发布

在前面 JIRA 的 issue 下面回复一条“构件已成功发布”的评论,通知 Sonatype 的工作人员为要发布的构件做审批,发布后会关闭该 issue。

等待构件审批通过

然后,等待。。。

从中央仓库中搜索构件

大概十多分钟后,可以在这里 https://repo1.maven.org/maven2 找到刚刚发布的构件,可以直接在 pom.xml 中使用啦~~

Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库的更多相关文章

  1. 如何将JAR包发布到Maven中央仓库?

    将jar包发布到Maven中央仓库(Maven Central Repository),这样所有的Java开发者都可以使用Maven直接导入依赖,例如fundebug-java: <!-- ht ...

  2. 将jar包发布到maven中央仓库

    将jar包发布到maven中央仓库 最近做了一个swagger-ui的开源项目,因为是采用vue进行解析swagger-json,需要前端支持,为了后端也能方便的使用此功能,所以将vue项目编译后的结 ...

  3. 贡献你的代码,将jar包发布到Maven中央仓库以及常见错误的解决办法

    前几天将自己的日志工具发布到了Maven中央仓库中.这个工具本省没有多少技术含量,因为是修改别人的源代码实现的,但是将jar发布到Maven仓库却收获颇丰,因为网上有些教程过时了,在此分享下自己发布j ...

  4. 将自己的项目作为jar包发布到maven中央仓库

    maven版本是3.5.0,jdk是1.8(注意,不是说项目是1.8就行,必须是环境变量里的也是,不能超过1.8,否则一大堆问题,执行mvn前用javac -version看下版本) 一:先在sona ...

  5. 如何将自己的jar包发布到mavan中央仓库

    最近自己写了一个关于网关限流的插件,然后想着肯定会有很多兄弟也需要使用到,所以就想着把jar包上传到Maven的中央仓库上让大家可以更方便的使用 现在咱们来看一下这个流程是什么样的呢. 首先呢,你得去 ...

  6. 将jar包发布到maven的中央仓库细节整理

    在学习springboot框架的时候,会引入各种各样的starter依赖,照着教程尝试写了个demo-spring-boot-stater,可以理解为一个组件,随引随用 但是只能自己引用,无法共享,于 ...

  7. 解决Maven本地仓库没有Jar包问题,请求中央仓库自动下载以及手动下载方法

    一.首先指定本地仓库 <localRepository>D:\software\Maven_Home\mvn_repository</localRepository> 二.修改 ...

  8. 如何将自己的代码发布到Maven中央仓库?

    去年在公司做工作流相关业务时,当时使用flowable做引擎,中途涉及到一些业务上的需求,自己整理了一些代码,考虑到开源精神,当时就想着将于公司业务无关的代码抽离出来,放到Maven中央仓库中,以供别 ...

  9. 如何将jar包加入到Maven本地仓库

    原则上Maven的设计是不需要这么做的,因为pom.xml中依赖的jar包会自动实现从中央仓库下载到本地仓库.但是公司设计了一个setting,如果本地仓库没有,就去setting指定的url中下载j ...

随机推荐

  1. 机器学习-Python 01

    机器学习中最常用最流行的语言工具现阶段应该是Python, 这篇文章主要介绍一些常用的Python语法知识.本篇博文适合那些有其他语言基础的程序员们,如果一点基础都没有,我建议先跳过.博主以前是做移动 ...

  2. luogu P4408 [NOI2003]逃学的小孩

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...

  3. 使用Python进行防病毒免杀

    很多渗透工具都提供了权限维持的能力,如Metasploit.Empire和Cobalt Strike,但是都会被防病毒软件检测到这种恶意行为.在探讨一个权限维持技巧的时候,似乎越来越多的人关注的是,这 ...

  4. OC 与js 互相调用

    参考文章 iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码) 参考文章 http://www.jianshu.com/p/fd378c6d70c0 利用苹果原生的JavaScriptC ...

  5. 基于LAMP php7.1搭建owncloud云盘与ceph对象存储S3借口整合案例

    ownCloud简介 是一个来自 KDE 社区开发的免费软件,提供私人的 Web 服务.当前主要功能包括文件管理(内建文件分享).音乐.日历.联系人等等,可在PC和服务器上运行. 简单来说就是一个基于 ...

  6. kerberos&ssh 原理、免密登录搭建

    原理 详细介绍 参考oracle文档:Kerberos 服务 安装过程 1.安装krb5 yum install -y krb5-server yum install krb5-workstation ...

  7. USB视频采集系统 视频测试软件将正式发布(方便调试测试各自摄像头,RAW,RGB,YUV)

    先上图,看看这个软件,学习fpga将近一年,了解视频图像开发方向也半年有余,不断学习不断总结,开发软件工具是为了更方便的学习新通信 主要相关知识: FPGA+SDRAM+VGA(双端口fifo技术) ...

  8. 【前端知乎系列】ArrayBuffer 和 Blob 对象

    本文首发在 个人博客 更多丰富的前端学习资料,可以查看我的 Github: <Leo-JavaScript>,内容涵盖数据结构与算法.HTTP.Hybrid.面试题.React.Angul ...

  9. get请求被浏览器跨域的同源策略请求机制拦截,但是get请求是否请求到了服务器呢

    浏览器会拦截跨域请求,但是只是拦截返回结果,请求还是会被发送到服务器. 请求因为跨域被拦截后,会改成 OPTIONS 请求送达服务器,这样服务器就可以知道有人在请求.

  10. centos7制作U盘启动盘

    一.准备相关软件 1.8G以上U盘 2.UltraISO虚拟光驱(试用版即可)最新版 下载地址:https://cn.ultraiso.net/xiazai.html  点击下载试用 3.CentOS ...