什么是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. Java——入门“HelloWorld”

    //Java程序的结构 //下面这个:外层框架 public class HellloWorld { // Java入口程序框架 //类名与文件名完全一样 public static void mai ...

  2. Java IO--字节流与字符流OutputStream/InputStream/Writer/Reader

    流的概念 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件. 字节流与字符流 内容操作就四个类:OutputStream.InputStream.Writer.Reader 字节流 ...

  3. 基于Servlet体系的HTTP请求代理转发Spring Boot组件

    背景概述 两个项目组原本都是各自负责两个产品线(产品A.产品B),由于公司业务的发展,目前需要将两个产品合并成一个大产品(功能整合,部分做取舍,最终产出产品C),前后端代码必然也需要整合,包括两个产品 ...

  4. HarmonyOS三方件开发指南(8)——RoundedImage

    [小年答谢,新春送礼]免费抽取1000元京东卡+更多新春好礼~查看详情>>> 目录: 1. RoundedImage组件功能介绍 2. RoundedImage使用方法 3. Rou ...

  5. hdu5884 Sort(二分)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  6. AtCoder Beginner Contest 168

    比赛链接:https://atcoder.jp/contests/abc168/tasks A - ∴ (Therefore) 题意 给出一个由数字组成的字符串 $s$,要求如下: 如果 $s$ 以 ...

  7. Codeforces Round #691 (Div. 2) C. Row GCD (数学)

    题意:给你两个数组\(a\)和\(b\),对于\(j=1,...,m\),找出\(a_1+b_j,...,a_n+b_j\)的\(gcd\). 题解:我们很容易的得出\(gcd\)的一个性质:\(gc ...

  8. 哈希算法解决:HDU1686 && POJ2774 && POJ3261

    HDU1686 题意: 找A串在B串中的出现次数(可重叠),可用KMP做,这里只提供哈希算法做的方法 题解: 先得到A串的hash值,然后在B中枚举起点,长度为lena的子串,检验hash值是否相同就 ...

  9. Codeforces Round #428 (Div. 2) C. Journey (简单搜索)

    题意:给你一颗树(边是无向的),从根节点向下走,统计走到每个子节点的概率,求所有叶子节点的深度乘上概率的和. 题解:每层子节点的概率等于上一层节点的概率乘\(1\)除以这层的子节点数,所以我们用\(d ...

  10. streamlink 安装使用

    CentOS 安装: pip install streamlink 使用: #查看视频信息 streamlink $URL #下载视频 streamlink $URL best streamlink ...