上传项目到Maven中央仓库

背景

修改了某个开源库的代码,以适应自己的项目情况。之前是临时发布到 github 静态页面去的,现在 github 访问很不稳定,所以需要发布到中央仓库。

注册帐号

入口有点难找,提示一下,在 Build 选项卡里面
https://issues.sonatype.org/secure/Signup!default.jspa

密码设置十分变态,12位,必须包含大小写数字特殊字符,有必要拿小本本记一下。而且最好不要设置在 xml 中需要转义的特殊字符,比如 &,否则后面配置 xml 时还要转义!不要问我为啥知道的。。

Jira申请

点击新建按钮,提一个 issue,只有申请通过了才有可能上传到中央仓库上,一般 5 分钟左右会有回应,我昨晚 10 点左右申请的,不知道是不是时差问题他们回应比较快:

创建 issue

创建 issue

有几个比较重要的地方说明:

1.问题类型一般选 New Project
2.Group Id 的几点要求

  • 如果是域名的话需要提供证明,或者把你的域名暂时重定向到你的 github主页,这样可以验证,比较麻烦
  • 会推荐使用 io.github.xxx (xxx 是你的 github 账户名)
  • com.github.xxx 不能用了
  • xxx 还需要跟下面的 Project URL 中的账户名对应,比如我这里账户名是 linceln,那么如果我的 Group Id 设置为 io.github.lince 也会审核不通过
    我最早用 jiatu.com 这个域名申请不通过
io.github.lince 也无法审核通过

上传

https://central.sonatype.org/publish/publish-maven/
我这次是上传到 Apache Maven,所以接下来的步骤都是参考以上链接做的,从晚上 9 点一直试到夜里 1 点才搞定,中间踩坑经历稍后会记录一下。

Nexus Staging Maven plugin

配置部署到 OSSRH Nexus Repository Manager 的插件,在 pom.xml 中配置插件:

<plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <version>1.6.7</version>
      <extensions>true</extensions>
      <configuration>
        <serverId>ossrh</serverId>
        <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
        <autoReleaseAfterClose>true</autoReleaseAfterClose>
      </configuration>
    </plugin>

此处照抄,所有东西不要去动它,比如 serverId
然后添加仓库管理,id 也不要去改动:

<distributionManagement>
  <snapshotRepository>
    <id>ossrh</id>
    <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
    <id>ossrh</id>
    <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
</distributionManagement>

setting.xml

配置 server,注意,这里的 id 和上面配置的 nexus-staging-maven-plugindistributionManagementid 保持一致,然后填入帐号密码:

2024.10.22 更新:不再支持明文帐号密码,需要生成token后填入。登录https://s01.oss.sonatype.org 后查看profile -- User Token

image.png

<servers>
    <server>
      <id>ossrh</id>
      <username>xxxxxxxx</username>
      <password>xxxxxxxxxxx</password>
    </server>
</servers>
  1. setting.xml 路径一般在 ~/.m2/setting.xml
  2. token生成指南:https://central.sonatype.org/publish/generate-portal-token/

Javadoc and Sources 插件

JavaDoc 是必须的,因为这个生成时间很长,有的项目会选择打包时跳过 JavaDoc,但是这样最后会导致可以上传到 sonatype.org,但是无法同步到中央仓库,白忙活一场。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.2.1</version>
      <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-javadoc-plugin</artifactId>
      <version>2.9.1</version>
      <executions>
        <execution>
          <id>attach-javadocs</id>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

GPG 签名组件

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-gpg-plugin</artifactId>
      <version>1.5</version>
      <executions>
        <execution>
          <id>sign-artifacts</id>
          <phase>verify</phase>
          <goals>
            <goal>sign</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

本地还要先有个 GPG 签名
Windows 版本这里下载:
https://www.gpg4win.org/get-gpg4win.html
Mac版本这里下载:
https://gpgtools.org/
安装完生成秘钥就好。

有一步比较关键的是要把公钥上传到公共服务器上,这样我们在上传Jar包等文件时对方可以从公共服务器上下载到并且验证你加密过的文件:

# 给公共服务器上传公钥
$ gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys <your key>
# 验证对方是否接收
$ gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys <your key>

打包部署

$ mvn clean deploy -DskipTests

打包过程中会要求输入 gpg 密钥的密码。

部署成功:


部署完成

闭坑指南

1. 注意部署的地址变了,看很多之前的教程还是用 https://oss.sonatype.org 这个地址,然后上传就报 403。

注意地址变化

2. 401 Unauthorized

这个基本都是帐号密码的问题,检查一下帐号密码是否填对了。另外注意 setting.xml 配置的 <server> 标签,id 是否和 nexus-staging-maven-plugindistributionManagement 配置的 id 一致:

    <server>
      <id>ossrh</id>
      <username>linceln</username>
      <password>xxxxxxxxxx</password>
    </server>

3. 有的教程会教你使用 org.sonatype.oss:oss-parent:7 这样的配置,这样你就完全不用配置了,但是官方已经标记这个方法不推荐使用了,默认还是上传到 https://oss.sonatype.org,报 403。

    <parent>
        <groupId>org.sonatype.oss</groupId>
        <artifactId>oss-parent</artifactId>
        <version>7</version>
    </parent>
————————————————
版权声明:本文为CSDN博主「VF」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tiger435/article/details/50470316
官方不推荐使用 oos-parent

4. 记得生成 JavaDocgpg签名,否则虽然可以上传,但是在 https://oss.sonatype.org/#stagingRepositories close 时报错,无法同步到中央仓库,还要重新来过。

保证上传的文件齐全

5. 以前上传完还需要手动 closerelease,现在 Nexus Staging Maven Plugin 插件可以配置自动执行这个过程。

回到https://oss.sonatype.org/#stagingRepositories,选中刚才发布的构件,并点击上方的close–>Confirm,在下边的Activity选项卡中查看状态,当状态变成closed后,执行Release–>Confirm,并在下边的Activity选项卡中查看状态,成功后构件自动删除,一小段时间(约1-2个小时)后即可同步到maven的中央仓库。
————————————————
版权声明:本文为CSDN博主「VF」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tiger435/article/details/50470316

现在 close 和 release 自动化了

注意,如果没有 JavaDoc 或者 GPG 签名,这一步无法完成,就会报错。

  1. 401 - Unauthorized
    报这个错最大可能是帐号密码搞错了,当然还有一个可能,是当前版本已经有了,如果没有改版本是无法上传的,也会报401

最后中间仓库的地址:
https://mvnrepository.com/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容