Maven中央仓库jar包发布全流程详解

CodeCosmicRover
• 阅读 5044

需要4步

  • 创建sonatype账号,并提交工单
  • 设置gpg
  • maven环境配置
  • deploy

1.创建sonatype账号,并提交工单

1.1 打开 https://issues.sonatype.org 注册账号

Maven中央仓库jar包发布全流程详解

  • 信息都很简单,Full name随便写个就好

1.2 创建工单

  • 登陆后点击Create创建工单

    Maven中央仓库jar包发布全流程详解

  • 然后开始工单信息的填写

    • 其中groupId可以直接使用com.github.xxx,当然pom里面也要和这个对应上

      Maven中央仓库jar包发布全流程详解

1.2.1 如何使用个人域名作为groupId
  • 首先要买个和groupId对应的域名

    • 例如本人的项目groupId为com.insistingon.binlogportal
    • 那么对应的域名就是insistingon.com
  • 设置域名的DNS配置给sonatype检测

    • 当使用个人域名提交工单时,工单的comment里面会提示

      Maven中央仓库jar包发布全流程详解

    • 需要证明这个域名的所有人,有两种方式

      • 加DNS的TXT记录
      • 重定向到你的github项目页面
    • 这里选择第一种比较简单,在购买域名的服务商页面,修改下DNS记录即可。
    • Maven中央仓库jar包发布全流程详解
    • 添加后即可通过验证
    • Maven中央仓库jar包发布全流程详解

2. 设置gpg

2.1 gpg是什么?

  • gpg是一个使用RSA算法加解密的软件
  • 有公网的公开仓库,可以上传公钥,供其他服务解密。简单说就是有公网的加解密服务
  • sonatype要求推送的jar包要加密,并会根据信息去公网的仓库验证,成功才能发布。

2.2 安装gpg

  • mac上直接使用brew install -v gpg安装

2.3 生成公钥

  • 生成命令gpg --generate-key

    • 执行命令后,会弹出设置passphrase的界面,就是密码,要记住,之后用到maven中
    • 生成后,会有一串字符,即为公钥的key,用于向公共仓库上传公钥

      Maven中央仓库jar包发布全流程详解

2.4 上传公钥

gpg --keyserver http://keys.openpgp.org:11371 --send-keys 398A7FD459F278FB0069E831IK98L741C1A767A2
  • 注意

    • 再上传时,如果只使用域名,不加端口,也可以成功,但是sonatype验证时会提示找不到key,原因暂未深究。

3. maven环境配置

  • 之后要使用maven直接上传jar包到sonatype的仓库中
  • 需要对.m2/setting.xml和项目的pom.xml做一些设置

3.1 将sonatype和gpg信息写入settings.xml

  • sonatype的信息配置在server中,供deploy的时候使用
<servers>
    <server>
        <id>ossrh</id>
        <username>name</username>
        <password>password</password>
    </server>
</servers>
  • gpg的信息设置在profile中,供maven的gpg插件使用
<properties>
    <gpg.executable>gpg可执行命令路径</gpg.executable>
    <gpg.passphrase>生成时填写的passphrase</gpg.passphrase>
</properties>

3.2 项目中的pom配置

  • 主要有两部分,deploy时的信息和要用到的插件
3.2.1 deploy时的信息包括证书,开发者信息,仓库地址和发布地址
<licenses>
    <license>
        <name>The Apache Software License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        <distribution>actable</distribution>
    </license>
</licenses>

<developers>
    <developer>
        <name>dothetrick</name>
        <email>flyinthewar@126.com</email>
        <organization>dothetrick</organization>
    </developer>
</developers>

<scm>
    <tag>master</tag>
    <url>git@github.com:dothetrick/binlogportal.git</url>
    <connection>git@github.com:dothetrick/binlogportal.git</connection>
    <developerConnection>git@github.com:dothetrick/binlogportal.git</developerConnection>
</scm>

<distributionManagement>
    <snapshotRepository>
        <id>ossrh</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>

    <repository>
        <id>ossrh</id>
        <name>Nexus Release Repository</name>
        <url>http://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>
3.2.2 要用到的maven插件
  • 要使用的插件

    • maven-javadoc-plugin
    • maven-jar-plugin
    • maven-source-plugin
    • maven-gpg-plugin
    • nexus-staging-maven-plugin
  • 使用这些插件是为了生成sonatype要求的各种包
3.2.3 maven-gpg-plugin报错的处理
  • 在使用时发现maven-gpg-plugin执行报错,Exit Code:2
  • 这个错误是应为下载的gpg版本和maven-gpg-plugin中版本冲突
  • 通过添加如下两个配置文件解决
  • gpg.conf
use-agent
pinentry-mode loopback
  • gpg-agent.conf
allow-loopback-pinentry
  • 实际配置如下
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <additionalOptions>
                    <additionalOption>-Xdoclint:none</additionalOption>
                </additionalOptions>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Built-By>dothetrick</Built-By>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-gpg-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>sign-artifacts</id>
            <phase>package</phase>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.sonatype.plugins</groupId>
    <artifactId>nexus-staging-maven-plugin</artifactId>
    <version>1.6.8</version>
    <extensions>true</extensions>
    <configuration>
        <serverId>ossrh</serverId>
        <nexusUrl>https://oss.sonatype.org/</nexusUrl>
        <autoReleaseAfterClose>false</autoReleaseAfterClose>
    </configuration>
</plugin>

4. deploy

  • 配置好maven后,之后可以通过mvn deploy直接推送包到sonatype
  • 这里设置的是推送后不会自动Release,因为超慢,不知道要多久
  • 所以最好是推送后,在页面上手动执行下release。

Maven中央仓库jar包发布全流程详解

  • 重要提示

    • 在发布新版本时,务必先执行mvn clean将target中老版本的jar包删除
    • 不然在发布到nexus后,版本包中会带有老版本的jar包,导致release失败
  • 让jar包更快的在中央仓库被搜索到

    • 当通过maven把jar成功发布到nexus并且release成功后,等了2个小时,也无法在maven中央仓库搜到
    • 网上找了N久无果,打算提工单询问了。突然想试下通过maven能不能下载到,新建一个项目,删除本地m2里面的包缓存,在pom里引用,发现成功了。再去maven中央仓库一搜,就搜到了。。
    • 之后又发了两个版本做实验,确认了,如果不使用maven依赖包的话,等8个小时也搜不到。只有maven下载一次,立马出来了。。

以上内容属个人学习总结,如有不当之处,欢迎在评论中指正

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引
0x00 filebeat配置多个topicfilebeat.prospectors:input_type:logencoding:GB2312fields_under_root:truefields:添加字段
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
CodeCosmicRover
CodeCosmicRover
Lv1
碛里征人三十万,一时回向月明看。
文章
4
粉丝
0
获赞
0