什么是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版本还需要后续步骤。

关闭和发布仓库暂存区的项目

打开: https://oss.sonatype.org

用注册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上的工作人员,他们告诉我这是服务端的问题,不是我配置的问题,顺便帮我解决了,于是顺利发布。

所以,在过程中有问题的话,积极在最开始创建的工单里添加注释问工作人员。回复还是很快的,我大概等了个把小时。需要注意的是时区问题,所以个把小时算很快啦。

至此,你学会了吗?

参考

将项目发布到 Maven 中央仓库踩过的坑

发布Jar包到maven中央仓库的更多相关文章

  1. 如何发布jar包到maven中央仓库

    自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然 ...

  2. 一份可以发布jar包到MAVEN中央仓库的POM

    [2017-01-03 更新]将基础的pom抽离成一个项目无关的parent pom,euler-framework的pom继承这个parent pom 今天在家折腾了一下怎么把Jar包发布到Mave ...

  3. 如何发布自己的 jar 包到 maven 中央仓库(待更新...)

    参考链接 如何发布自己的 jar 包到 maven 中央仓库

  4. maven插件上传本地jar包到maven中央仓库

    settings配置(如果设置后有问题,可以重启idea,保证重新加载settings文件): <!-- 上传jar包到maven中央仓库配置start --> <server> ...

  5. 上传jar包到maven中央仓库过程中遇到的一些问题总结!

    网上有很多相关教程, 我按步骤一步步走下来, 都还算顺利, 简单列举一下步骤以及其中需要注意的几个点(不详细, 不适合当教程) 第一步: 到https://issues.sonatype.org/se ...

  6. 发布jar包到远端github仓库使用(将github仓库当作maven仓库)

    今天把单点登陆的core模块搬到了github仓库 并且利用github仓库作为maven仓库 在项目中进行了引用 1. 起初看技术博客没有完全引入进来,调整了一下OK了 2. 还可以将其他模块或者工 ...

  7. 如何将 jar 包导入Maven 本地仓库

    案例:oracle jar包由于在maven 远程仓库中找不到,需要先将oracle jar 文件下载到本地,然后导入maven本地仓库,就可以通过 pom 进行依赖 例如:下载后的 jar 地址 D ...

  8. 手动安装jar包到Maven本地仓库

    接手别人的一个项目,Maven工程,导入后,某些jar包找不到,然后从同事那复制Maven本地仓库的文件夹到我的电脑,发现依旧找不到.问题大致总结为:本地maven仓库存在jar,但是依然报Missi ...

  9. 本地jar包安装Maven本地仓库

    下载jar包 如果本地存在,可以忽略. 本地安装命令 mvn install:install-file -Dfile=D:\Environment\Java\JDK\lib\tools.jar -Dg ...

随机推荐

  1. (24)bzip2命令:压缩文件(.bz2格式)&&bunzip2命令:bz2格式的解压缩命令

    1.bzip2 命令同 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件.当执行压缩任务完成后,会生成一个以".bz2"为 ...

  2. 一文读懂云上DevOps能力体系

    简介: 阿里云ECS自动化运维套件架构师,深度拆解云上运维能力体系建设:自动化运维等级金字塔.自动化运维的进阶模式.DevOps的基础核心.云上标准化部署三大能力-- 序言 云计算行业已经有十多年的发 ...

  3. Vuejs 基础学习教程

    (四)构建基础进阶-env文件与环境设置 我们在实际开发中,我们一般会经历项目的开发阶段,测试阶段,和最终上线阶段,每个阶段对于项目代码的需要可能都有所不同,那我们怎么让它在不同阶段呈现不同的效果呢? ...

  4. Linux远程拷贝scp

    Linux的scp命令可以实现两台服务器之间互相拷贝文件,我的测试环境是Centos6.4. 基本的命令格式 scp 拷贝目标文件 远程用户@远程主机地址:远程目录 一.从本机拷贝到目标远程主机 # ...

  5. 「SCOI2005」互不侵犯 (状压DP)

    题目链接 在\(N\times N\) 的棋盘里面放 \(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\) 个格子 ...

  6. Codeforces Global Round 9 E. Inversion SwapSort

    题目链接:https://codeforces.com/contest/1375/problem/E 题意 给出一个大小为 $n$ 的数组 $a$,对数组中的所有逆序对进行排序,要求按照排序后的顺序交 ...

  7. Educational Codeforces Round 89 (Rated for Div. 2) C. Palindromic Paths(贪心)

    题目链接:https://codeforces.com/contest/1366/problem/C 题意 有一个 $n \times m$ 的 $01$迷宫,要使从 $(1,1)$ 到 $(n,m) ...

  8. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  9. zjnu1725 COCI (类似二维树状数组模拟)

    Description The 3rd round of COCI is already here! In order to bet on predict the scores, we have as ...

  10. c语言中qsort函数的使用、编程中的一些错误

    qsort()函数: 功能:相当于c++sort,具有快排的功能,复杂度的话nlog(n)注:C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法.两者的时间复杂度都是nlog ...