发布Jar包到maven中央仓库
什么是maven中央仓库
maven是java世界最流行的构建工具,构建内容囊括了一个java项目的整个生命周期。其中最重要的功能就是依赖管理,maven通过一个类似云的ftp站点统一管理所有java 的jar文件,同时给每个文件的每个版本一个统一的唯一坐标。开发人员通过检索配置这些坐标,选择自己需要的构件搭建自己的项目环境。因此,通过一个叫做pom的描述文件,我们就可以在任何平台搭建好项目运行所需要的环境。方便了协作和分享代码。
而那个类似云的ftp站点就是maven中央仓库。由于一些不可抗拒因素,我们对于中央仓库的访问速度比较慢。因此在平时工作环境中,我们往往都是使用一些镜像站点,如阿里云和开源中国的仓库镜像。同时由于公司里的商业代码不可发布到公开站点,我们也会在局域网内搭建私服。但是无论是镜像还是私服,都像是缓存,虽然提高了下载速度,但是最终,所有的jar都来自中央仓库。因此,如果我们将项目发布到了maven 中央仓库中,那么在所有基于maven或者gradle等的项目里都可以依赖下载你的构件。真正做到了一次发布,处处可用。
发布到中央仓库的好处
首先,作为一个java从业者,对于天天都在用的东西,做一个深入的了解,发布一个项目到中央仓库可以自我满足。作为我来讲,我发布了一个自己的项目,开始有了利用下班时间好好写点开源代码学习和装逼的冲动。
再者,作为一个经验丰富的java开发工程师,我们在日常工作中总会积攒下自己使用得很顺手的一些轮子或者一些通用的基础类。如果我们整理好,并持续维护,发布到了中央仓库之后,就可以避免很多重复性的工作。而且也避免了很多冲突:我现在的公司里,每个项目的dubbo调用接口都会自己定义一个Response和Request类。同一类型的重复定义,跟cpp的多根继承一样烦。这样的结果导致了没法统一处理各个系统的调用返回值。既不够优雅,也显得重复。如果我们把这些基础的东西发布到了中央仓库,就只需要引用一下了。当然这种情况一般是发布到私服比较好,我只是举个例子。具体的大家自行体会。
发布过程
开始步入正题了啊~
注册发布账户
maven中央仓库的发布管理是在一个基于jira的缺陷跟踪平台上进行的。
首先你需要注册一个账户:https://issues.sonatype.org/secure/Dashboard.jspa


创建工单申请groupId
添加邮箱,用户名,密码,验证码之后登陆账户。

之后点击create:

带有红色星号的信息为必填。
Summary:你的项目的名称
Description:建议还是写一些比较好
Group Id:com.github.yungyu16(如果有自己的域名,就用自己的倒序域名,如果没有,推荐使用github地址。)
Project URL:在github上复制你的项目的url地址
SCM url:在github上克隆你的项目是用的git地址
最后点击“Create”创建这个Issue,
等待工作人员回应
由于美国时区的缘故,你的工单可能需要一段时间才能得到回应,我大概等了个把小时。工作人员会在issue下添加comment给你提示,当你看到如下图所示时,说明你的groupId已经准备好了。

至此,我们可以进行下一步操作了。
配置项目的pom文件
首先第一步是在pom文件里添加 distributionManagement 节点。添加发布的仓库地址,对于发布到中央仓库,此节点的内容是相同的。唯一差别的是仓库id,一般来说都是用release或者oss-release。我使用的是oss-release。可以配置一个用于发布项目的profile节点。如下所示:
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<!-- Source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.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>
<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>
</plugins>
</build>
<distributionManagement>
<snapshotRepository>
<id>oss-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>oss-releases</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</profile>
</profiles>
同时在你所使用的maven目录的conf/settings.xml 里配置server节点:
<server>
<id>oss-releases</id>
<username>BAadxaxr</username>
<password>xQMnQNCUmd4uo/xQMnQNCUmd4uo</password>
</server>
<server>
<id>oss-snapshots</id>
<username>BAadxaxr</username>
<password>xQMnQNCUmd4uo/xQMnQNCUmd4uo</password>
</server>
发布时使用命令 mvn clean deploy -Prelease
安装gpg
gpg是GNU开发的开源程序,利用非对称密钥对来进行签名校对。我们需要下载安装对应平台的版本。下载地址:https://www.gnupg.org/download/index.html

安装步骤:

然后一直下一步就行了,它会自己添加到path路径。
生成密钥对并上传公钥
可参考: https://www.jianshu.com/p/268064e67719
安装 GPG 软件后,打开命令行窗口,依次做以下操作:
生成密钥对

私钥密码很关键,要后面需要用到。
查看密钥对

我有两对密钥,因为我之前生成了一对,为了演示又生成了一对。
发布密钥

密钥服务器有很多台,我们发布到一台之后,他们会进行同步。
发布项目
mvn clean deploy -Prelease
发布过程中会弹框让你填写之前生成密钥对时的密码,填写即可。如果不想每次填写,可以在profile中添加如下元素。

注:上图有错误,应该是gpg,而不是gpg2(去他丫的不想换图。。。).
注意: 发布项目时快照版本和release版本会发往不同的仓库,快照版本发布到这个步骤就已经发布成功,可以从中央仓库下载。release版本还需要后续步骤。
关闭和发布仓库暂存区的项目
用注册jira时的用户名和密码登录。

点击如图示:

在右侧找到自己发布的项目,一般在最后。

选中后,先点击close,查看下面的activity查看状态,正常关闭后,再点击release。大概需要几分钟时间。

这里可能会出现一种情况,就是在关闭过程中,显示异常,提示说签名校验不通过,这个一般是前面步骤密钥生成和发布时有问题,我遇到了这个情况,怎么都搞不好,然后我就换了台电脑弄了。。。
release显示完成以后,就可以在 http://mvnrepository.com/ 搜索到自己发布的项目啦。。。
发布完成后我们需要去最开始我们创建的那个工单下面备注下,说明我们已经完成了。

备注:
同一个groupId是不需要重复提交工单申请的。也就是说你申请了一个groupId之后,后续的相同groupId的项目直接用你的用户名和密码上传就是了。
在申请工单里可以注明允许哪些用户名可以上传构件到这个groupId,一般是自己,也可以写上协作者。这样就都可以往按个groupId上传构件了。
最后
最后要说一个坑:
就是在发布过程中,快照版本的发布时很顺利的,一发就成功。但是release版本在发布过程中,到时报错:in maven build it ends with a deployment error : Forbidden

我各种折腾了好久,最后还是联系了jira上的工作人员,他们告诉我这是服务端的问题,不是我配置的问题,顺便帮我解决了,于是顺利发布。

所以,在过程中有问题的话,积极在最开始创建的工单里添加注释问工作人员。回复还是很快的,我大概等了个把小时。需要注意的是时区问题,所以个把小时算很快啦。
至此,你学会了吗?
参考
发布Jar包到maven中央仓库的更多相关文章
- 如何发布jar包到maven中央仓库
自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然 ...
- 一份可以发布jar包到MAVEN中央仓库的POM
[2017-01-03 更新]将基础的pom抽离成一个项目无关的parent pom,euler-framework的pom继承这个parent pom 今天在家折腾了一下怎么把Jar包发布到Mave ...
- 如何发布自己的 jar 包到 maven 中央仓库(待更新...)
参考链接 如何发布自己的 jar 包到 maven 中央仓库
- maven插件上传本地jar包到maven中央仓库
settings配置(如果设置后有问题,可以重启idea,保证重新加载settings文件): <!-- 上传jar包到maven中央仓库配置start --> <server> ...
- 上传jar包到maven中央仓库过程中遇到的一些问题总结!
网上有很多相关教程, 我按步骤一步步走下来, 都还算顺利, 简单列举一下步骤以及其中需要注意的几个点(不详细, 不适合当教程) 第一步: 到https://issues.sonatype.org/se ...
- 发布jar包到远端github仓库使用(将github仓库当作maven仓库)
今天把单点登陆的core模块搬到了github仓库 并且利用github仓库作为maven仓库 在项目中进行了引用 1. 起初看技术博客没有完全引入进来,调整了一下OK了 2. 还可以将其他模块或者工 ...
- 如何将 jar 包导入Maven 本地仓库
案例:oracle jar包由于在maven 远程仓库中找不到,需要先将oracle jar 文件下载到本地,然后导入maven本地仓库,就可以通过 pom 进行依赖 例如:下载后的 jar 地址 D ...
- 手动安装jar包到Maven本地仓库
接手别人的一个项目,Maven工程,导入后,某些jar包找不到,然后从同事那复制Maven本地仓库的文件夹到我的电脑,发现依旧找不到.问题大致总结为:本地maven仓库存在jar,但是依然报Missi ...
- 本地jar包安装Maven本地仓库
下载jar包 如果本地存在,可以忽略. 本地安装命令 mvn install:install-file -Dfile=D:\Environment\Java\JDK\lib\tools.jar -Dg ...
随机推荐
- OSPF特殊区域和LSA
OSPF路由计算优选次序: (1) 直连路由:本路由器发起的LSA 1.2: (2) 区域内路由:O: LSA 1.2: (3) 区域间路由:O IA: LSA 3: (4) 1类外部路由:O E1: ...
- 虚拟局域网(VLAN)__语音VLAN
1.语音VLAN特性使得访问端口能够携带来自IP电话的IP语音流量.当交换机连接到Cisco IP电话时,IP电话就用第3层IP优先级(precedence)和第2层服务级别(class of ser ...
- TCP/IP__Cisco的3层分层模型
1. Cisco的层次模型:3个层次和它们的典型功能 核心层:骨干 分配层:路由 接入层:交换 核心层 1. 核心层就是网络的核心.它位于顶层,负责可靠而迅速地传输大量的数据流.网络核心层的唯一意图是 ...
- 【xml】控件常用属性
https://www.cnblogs.com/xqz0618/p/textview.html (常用,生动) https://www.jianshu.com/p/992324336dd9 (全,简洁 ...
- Ubuntu18.04系统设置为中文语言
1.选择右上角设置按钮 2.管理已安装的语言 3.安装简体中文 安装好后是这样的 会发现汉语中文那一块是灰色的,怎么点都点不亮 4.拖拽 汉语(中国) 到最顶边 然后应用 5.重启 然后就出现这个画面 ...
- 搜索Ex (洛谷提高历练地)
搜索Ex P1120 小木棍 题意:不超过65根长度小于50的小木棍(是由一批等长木棍砍断得到的),求原始木棍的最小可能长度 分析:优化+减枝爆搜 搜索状态要记录当前尝试的已经填好的长度,当前尝试填的 ...
- HttpClient客户端网络编程——高可用、高并发
本文是HttpClient的学习博客,RestTemplate是基于HttpClient的封装,feign可基于HttpClient进行网络通信. 那么作为较底层的客户端网络编程框架,该怎么配置使其能 ...
- 如何加入VNT Hubble主网
环境:Ubuntu20.04 (但以下方法应该只要不是过于老旧的Ubuntu,都行得通) 从源码安装go-vnt 安装Go编译器(版本大于1.9)和C编译器 安装C编译器GCC[1] sudo apt ...
- 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】
题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...
- c++ cin 读入txt的问题
源程序 #include <iostream> using namespace std; struct Stack { int tos; int stackarray[1000]; }; ...