欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

关于maven中央仓库

  • 作为一个java程序员,对maven中央仓库https://mvnrepository.com/自然是非常熟悉的,毕竟咱们的应用依赖的jar大部分都来自此处,如果您想把自己开发的java库也托管在上面,让大家像使用Jackson、Spring那样轻松简单的使用您的jar,就请随本文一起操作吧;

  • 先看看效果,下图是我发布的java库在中央仓库的搜索结果:

前提条件

  • 由于sonatype官方会要求您在github创建一个仓库(仓库名由sonatype官方指定,以此验证您是否有github操作权限),因此请确保您自己有github账号,并且可以创建仓库

本篇概览

  • 梳理一下,按照以下步骤将自己的java库发布到maven中央仓库:

  • 文末还会对曾经踩过的小坑做了总结,希望能帮助读者们提前避开

  • 看起来略有些繁琐,但其实很简单,接下来开始吧

准备工作

  • 首先请把您的java工程准备好,我用的是一个非常普通的maven工程,名为opencv-linux,github仓库地址https://github.com/zq2599/opencv-client

  • 本次涉及的软件信息如下:

  1. 操作系统:macOS Monterey(12.0.1)
  2. JDK:1.8.0_312
  3. Maven:3.8.3

1. 注册帐号

2. 创建问题(issue)

  • 点击上图红框中的新建开始创建issue,如下图,项目选择Community Support,问题类型是New Project:

  • 接下来填写项目相关的信息,请注意Project URL里面是您自己的工程对应的github仓库地址:

  • 提交后等待几分钟,注册账号时填写的邮箱会收到一封邮件,要求你创建一个仓库,以此来证明之前提交的github帐号属于你自己:

  • 上述内容在刚才新建的issue页面也能看到,如下图,即sonatype的评论:

3. 创建sonatype指定的仓库

4. 在issue上进行回复

  • 打开issuse,增加一个评论,如下图:

  • 不久后(我这边是十多分钟),就会收到一条新的评论,通知你可以去做发布了,并给你了snapshot和release的发布地址:

5. 安装GPG

  • 后面的操作中,在将jar发布到中央仓库时,要用GPG工具对上传的数据进行签名,因此接下来要准备好GPG秘钥

  • 先安装GPG软件,打开网站:https://www.gnupg.org/download/

  • 下载安装文件,请选择适合您的操作系统的,我的选择如下图红框:

  • 安装GPG

6. 生成秘钥并上传

  • 安装完成后,在控制台执行gpg2 --gen-key开始创建秘钥

  • 根据提示输入账号、邮箱、密码等:

  1. GnuPG needs to construct a user ID to identify your key.
  2. Real name: zq2599
  3. Email address: zq2599@gmail.com
  4. You selected this USER-ID:
  5. "zq2599 <zq2599@gmail.com>"
  6. Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
  • 操作完成后得到如下信息:
  1. gpg: key 11027EJIHGFEDCBA marked as ultimately trusted
  2. gpg: directory '/Users/will/.gnupg/openpgp-revocs.d' created
  3. gpg: revocation certificate stored as '/Users/will/.gnupg/openpgp-revocs.d/561AEE4EA92EE3E4C389941811027E9876543210.rev'
  4. public and secret key created and signed.
  5. pub rsa3072 2021-11-10 [SC] [expires: 2023-11-10]
  6. 561AEE4EA92EE3E4C389941811027E9876543210
  7. uid zq2599 <zq2599@gmail.com>
  8. sub rsa3072 2021-11-10 [E] [expires: 2023-11-10]
  • 如上所示,得到了pub key等于561AEE4EA92EE3E4C389941811027E9876543210

  • 执行以下命令,将秘钥同步到云端,注意keyserver,网上可以搜到很多个,个人实际操作中,下面这个是可以成功的:

  1. gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 561AEE4EA92EE3E4C389941811027E9876543210

7. maven全局配置

  • 试想把sonatype的账号密码写在项目的pom.xml中,再上传到github让所有人都看到?相信您一定不愿意这样,所以还是放在maven的全局配置中比较安全,毕竟是保存在自己的电脑上

  • 打开maven的配置文件settings.xml,在servers下面增加一个server节点,这是个账号密码的配置,对应的是https://issues.sonatype.org的账号密码:

  1. <server>
  2. <id>ossrh</id>
  3. <username>zq2599</username>
  4. <password>12345678</password>
  5. </server>
  • 在profiles下增加一个profile节点,gpg.passphrase的内容是刚才创建gpg秘钥时输入的密码:
  1. <profile>
  2. <id>gpg</id>
  3. <properties>
  4. <!-- 由于我的电脑装的gpg2,所以需要指定执行gpg2,否则会报错 -->
  5. <gpg.executable>gpg2</gpg.executable>
  6. <gpg.passphrase>abcdefgh</gpg.passphrase>
  7. </properties>
  8. </profile>
  • 涉及到账号密码的全局配置就完成了,接下来打开您的java工程,咱们去修改pom.xml的配置

8. maven项目配置

  • 首先要搞清楚发布仓库的地址在哪,官方指导如下,给出了snapshot和release的仓库地址:

  • 以下是java工程的pom.xml文件,需重点关注的地方都有中文注释,请不要漏掉带序号的注释,这些都是最关键的配置,这种注释共11个:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>io.github.zq2599</groupId>
  6. <artifactId>opencv-linux</artifactId>
  7. <version>0.0.3</version>
  8. <name>opencv-linux</name>
  9. <description>opencv-linux</description>
  10. <!-- 1. url必须要有,不然远程提交时会返回错误 -->
  11. <url>https://github.com/zq2599/opencv-client</url>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. </properties>
  15. <packaging>jar</packaging>
  16. <!-- 2. 开源证书 -->
  17. <licenses>
  18. <license>
  19. <name>The Apache Software License, Version 2.0</name>
  20. <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
  21. <distribution>repo</distribution>
  22. </license>
  23. </licenses>
  24. <!-- 3. 源码仓库信息 -->
  25. <scm>
  26. <connection>scm:git:git@github.com:zq2599/opencv-client.git</connection>
  27. <developerConnection>scm:git:git@github.com:zq2599/opencv-client.git</developerConnection>
  28. <url>https://github.com/zq2599/opencv-client/tree/main</url>
  29. </scm>
  30. <!-- 4. 开发人员信息 -->
  31. <developers>
  32. <developer>
  33. <name>zq2599</name>
  34. <email>zq2599@gmail.com</email>
  35. <organization>https://github.com/zq2599</organization>
  36. <timezone>+8</timezone>
  37. </developer>
  38. </developers>
  39. <!-- 5. 上传的仓库地址,以及使用哪个账号密码配置 -->
  40. <distributionManagement>
  41. <snapshotRepository>
  42. <id>ossrh</id>
  43. <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
  44. </snapshotRepository>
  45. <repository>
  46. <id>ossrh</id>
  47. <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  48. </repository>
  49. </distributionManagement>
  50. <dependencies>
  51. <dependency>
  52. <groupId>org.projectlombok</groupId>
  53. <artifactId>lombok</artifactId>
  54. <version>1.16.18</version>
  55. </dependency>
  56. </dependencies>
  57. <build>
  58. <!-- 配置好每个插件的属性 -->
  59. <pluginManagement>
  60. <plugins>
  61. <!-- 6. 上传到sonatype的插件 -->
  62. <plugin>
  63. <groupId>org.sonatype.plugins</groupId>
  64. <artifactId>nexus-staging-maven-plugin</artifactId>
  65. <version>1.6.7</version>
  66. <extensions>true</extensions>
  67. <configuration>
  68. <!-- 这里的id必须要和全局配置中的server一致 -->
  69. <serverId>ossrh</serverId>
  70. <!-- 这个地址,一定要和issue的评论中给出的地址一致! -->
  71. <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
  72. <!-- 如果希望发布后自动执行close和release操作,此处可以调整为true -->
  73. <autoReleaseAfterClose>false</autoReleaseAfterClose>
  74. </configuration>
  75. </plugin>
  76. <!-- 7. 上传源码的插件 -->
  77. <plugin>
  78. <groupId>org.apache.maven.plugins</groupId>
  79. <artifactId>maven-source-plugin</artifactId>
  80. <version>3.1.0</version>
  81. <inherited>true</inherited>
  82. <executions>
  83. <execution>
  84. <id>attach-sources</id>
  85. <goals>
  86. <goal>jar</goal>
  87. </goals>
  88. </execution>
  89. </executions>
  90. <configuration>
  91. <excludeResources>true</excludeResources>
  92. <useDefaultExcludes>true</useDefaultExcludes>
  93. </configuration>
  94. </plugin>
  95. <!-- 8. 生成doc文档的插件 -->
  96. <plugin>
  97. <groupId>org.apache.maven.plugins</groupId>
  98. <artifactId>maven-javadoc-plugin</artifactId>
  99. <version>3.0.0</version>
  100. <inherited>true</inherited>
  101. <executions>
  102. <execution>
  103. <id>bundle-sources</id>
  104. <phase>package</phase>
  105. <goals>
  106. <goal>jar</goal>
  107. </goals>
  108. </execution>
  109. </executions>
  110. <configuration>
  111. <maxmemory>1024</maxmemory>
  112. <encoding>UTF-8</encoding>
  113. <show>protected</show>
  114. <notree>true</notree>
  115. <!-- Avoid running into Java 8's very restrictive doclint issues -->
  116. <failOnError>false</failOnError>
  117. <doclint>none</doclint>
  118. </configuration>
  119. </plugin>
  120. <!-- 9. 编译构建maven工程的插件 -->
  121. <plugin>
  122. <groupId>org.apache.maven.plugins</groupId>
  123. <artifactId>maven-compiler-plugin</artifactId>
  124. <configuration>
  125. <source>1.8</source>
  126. <target>1.8</target>
  127. <encoding>UTF-8</encoding>
  128. </configuration>
  129. </plugin>
  130. </plugins>
  131. </pluginManagement>
  132. <!-- 10. 确定要使用哪些插件 -->
  133. <plugins>
  134. <plugin>
  135. <groupId>org.sonatype.plugins</groupId>
  136. <artifactId>nexus-staging-maven-plugin</artifactId>
  137. </plugin>
  138. <plugin>
  139. <groupId>org.apache.maven.plugins</groupId>
  140. <artifactId>maven-source-plugin</artifactId>
  141. </plugin>
  142. <plugin>
  143. <groupId>org.apache.maven.plugins</groupId>
  144. <artifactId>maven-compiler-plugin</artifactId>
  145. </plugin>
  146. </plugins>
  147. </build>
  148. <profiles>
  149. <profile>
  150. <id>release</id>
  151. <build>
  152. <plugins>
  153. <!-- 11. 生成签名,确定使用那个gpg秘钥 -->
  154. <plugin>
  155. <groupId>org.apache.maven.plugins</groupId>
  156. <artifactId>maven-gpg-plugin</artifactId>
  157. <version>1.5</version>
  158. <executions>
  159. <execution>
  160. <!-- 必须和配置中的gpg校验id一致 -->
  161. <id>gpg</id>
  162. <phase>verify</phase>
  163. <goals>
  164. <goal>sign</goal>
  165. </goals>
  166. </execution>
  167. </executions>
  168. </plugin>
  169. </plugins>
  170. </build>
  171. </profile>
  172. </profiles>
  173. </project>

9. 编译、构建、上传

  • 编译构建上传其实很简单,下面一行命令搞定(进入pom.xml所在目录下执行以下命令):
  1. mvn clean javadoc:jar deploy -P release
  • 构建期间会弹出窗口让你输入密码,请输入创建GPG秘钥时设置的密码:

  • 构建和上传成功后,控制台输出如下(截选):
  1. ...
  2. [INFO] Installing /Users/zhaoqin/github/blog_demos/opencv-linux/target/opencv-linux-0.0.3-sources.jar.asc to /Users/zhaoqin/github/blog_demos/opencv-linux/target/nexus-staging/staging/543da2cd9af848/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc
  3. [INFO] Performing remote staging...
  4. [INFO]
  5. [INFO] * Remote staging into staging profile ID "543da2cd9abc12"
  6. [INFO] * Created staging repository with ID "iogithubzq2599-1008".
  7. [INFO] * Staging repository at https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008
  8. [INFO] * Uploading locally staged artifacts to profile io.github.zq2599
  9. Uploading to ossrh:
  10. ...
  11. https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc (659 B at 1.2 kB/s)
  12. [INFO] * Upload of locally staged artifacts finished.
  13. [INFO] * Closing staging repository with ID "iogithubzq2599-1008".
  14. Waiting for operation to complete...
  15. ...
  16. [INFO] Remote staged 1 repositories, finished with success.
  17. [INFO] ------------------------------------------------------------------------
  18. [INFO] BUILD SUCCESS
  19. [INFO] ------------------------------------------------------------------------
  20. [INFO] Total time: 27.199 s
  21. [INFO] Finished at: 2021-11-12T08:08:37+08:00
  • 记住上述信息中展示的iogithubzq2599-1008,这是本次上传操作在仓库中对应的ID

10. 登录指定的仓库网址

  • 接下来登录Nexus网站,具体的网址一定要看issue的评论,如下图红框,我这里要登录的是:https://s01.oss.sonatype.org

11. 发布

  • 登录成功后,点击下图红框中的Staging Repositories:

  • 如下图,找到合适的记录(我这里是iogithubzq2599-1008),点击红框3中的Release进行发布,如果状态不是closed,就要展开底部的Activity查看发生了什么异常:

  • 操作成功,如下图所示:

12. issue收到评论,提示完成时间

  • 静候十多分钟,issue上收到一条评论,提示同步操作已激活,三十分钟内同步到https://repo1.maven.org/,四小时内同步到https://search.maven.org:

  • 网上有文章提到第一次发布要在issuse上评论,才会触发同步操作,我这里没有遇到(正打算评论呢,发现已经开始同步了)

13. 三十分钟内同步到https://repo1.maven.org

14. 四小时内同步到https://search.maven.org

15. 二十四小时内同步到https://mvnrepository.com/

  • 同步到https://mvnrepository.com的时间并不是精确的二十四小时,而是我时隔二十四左右在此网站上可以搜索到自己的库:

  • 至此,自己的java库已成功发布到maven中央仓库,可以像Jackson、Spring库那样使用这个库了,用法就是添加这个依赖:
  1. <dependency>
  2. <groupId>io.github.zq2599</groupId>
  3. <artifactId>opencv-linux</artifactId>
  4. <version>0.0.3</version>
  5. </dependency>

踩坑记录

  • 现在已完成了所有的操作,回顾一下,整个过程其实相对比较顺利,只遇到了三个小坑需要您注意:
  1. 同步gpg秘钥到云端的时候,网上有文章提到用hkp://subkeys.pgp.net,我在使用该地址的时候一直在报错,改为hkp://keyserver.ubuntu.com:11371之后上传成功
  2. maven工程的pom.xml文件中,一定要有url节点,如下图,否则会在同步到云端的时候报错Project url missing

  1. 发布的操作是在网页上进行的,网上有的文章提到网站是https://oss.sonatype.org,最初我也打开了该网页并尝试登录,可惜始终登录失败,最终,在issue的评论上发现如下图红框,要登录的网站是https://s01.oss.sonatype.org

  • 至此,所有操作都已完成,如果您正在将自己的java库发布到maven中央仓库,希望本文能给您一些参考

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

https://github.com/zq2599/blog_demos

我把自己的java库发布到了maven中央仓库,从此可以像Jackson、Spring的jar一样使用它了的更多相关文章

  1. 发布构件到Maven中央仓库

    一.注册jira账号 访问如下网址: https://issues.sonatype.org/secure/Signup.jspa 记住邮箱,用户名,密码以备以后使用,一定牢记. 二.创建一个issu ...

  2. 发布项目到maven中央仓库

    https://www.xiaominfo.com/2017/04/25/swagger-bootstrap-ui-issue-maven-central/?tdsourcetag=s_pcqq_ai ...

  3. 喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库

    相信通过java和SQLServer开发应用的同学们都经历过如下类似的问题. 微软提供的JDBC官方驱动没有放置在Maven仓库中,这样如果你的Java应用需要访问SQL Server,你不得不下载s ...

  4. Maven中央仓库发布历程

    一.前言 最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,通过这个组件,我们可以动态根据配置文件进行多个线程池的初始 ...

  5. 发布Jar包到maven中央仓库

    什么是maven中央仓库 maven是java世界最流行的构建工具,构建内容囊括了一个java项目的整个生命周期.其中最重要的功能就是依赖管理,maven通过一个类似云的ftp站点统一管理所有java ...

  6. 贡献你的代码,将jar包发布到Maven中央仓库以及常见错误的解决办法

    前几天将自己的日志工具发布到了Maven中央仓库中.这个工具本省没有多少技术含量,因为是修改别人的源代码实现的,但是将jar发布到Maven仓库却收获颇丰,因为网上有些教程过时了,在此分享下自己发布j ...

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

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

  8. Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库

    摘要 Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Ma ...

  9. 使用CI/CD工具Github Action发布jar到Maven中央仓库

    之前发布开源项目Payment Spring Boot到Maven中央仓库我都是手动执行mvn deploy,在CI/CD大行其道的今天使用这种方式有点"原始".于是我一直在寻求一 ...

随机推荐

  1. 账号不允许远程访问服务器上的mysql数据库的解决办法host is not allowed to connect to this mysql

    改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "use ...

  2. react 实现tab切换 三角形筛选样式

    ​ ​ 这次使用的是react的class 类组件 import React, { Component } from 'react' import { LeftOutline, SearchOutli ...

  3. vue+uniapp实现美颜拍照录像,相册选择 | 录像限制时长,美颜拍照录像

    一.插件简介 Zhimi-BeautyCamera(智密 - 美颜相机图册插件)是一个支持美颜录像,美颜拍照,选择图视频功能,带录像参数时长限制的uniapp原生插件.平台支持:Android.IOS ...

  4. JAVA获取当前请求的URL地址,包含请求链接中的参数

    /** * 获得当前访问的URL路径 * @param request * @return */ public static String getLocation(HttpServletRequest ...

  5. Vue总结第五天:vue-router (使用模块化(创建Vue组件)机制编程)、router-link 标签的属性、路由代码跳转、懒加载、路由嵌套(子路由)、路由传递数据、导航守卫)

    Vue总结第五天:vue-router ✿ 路由(器)目录: □  vue中路由作用 □  vue-router基本使用 □  vue-router嵌套路由 □  vue-router参数传递 □  ...

  6. 【LeetCode】1405. 最长快乐字符串 Longest Happy String

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...

  7. 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)

    [LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...

  8. MySQL与Oracle 差异比较之二函数

    函数 编号 类别 ORACLE MYSQL 注释 1 数字函数 round(1.23456,4) round(1.23456,4) 一样:ORACLE:select round(1.23456,4) ...

  9. FAT

    目录 概 主要内容 代码 Zhang J., Xu X., Han B., Niu G., Cui L., Sugiyama M., Kankanhalli M. Attacks which do n ...

  10. 基于Spring MVC + Spring + MyBatis的【外包人力资源管理系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/45600390 练习点设计:模糊查询.删除.新增 一.语言和环境 实现语言:JAVA语 ...