Maven发布开源框架到远程仓库
1.背景
当你写了一个自我感觉良好的开源工具希望给他人分享,如果只是在github等网站进行公布之外,用户使用起来还不是很方便,特别是当你提供是特定领域的基础工具。你还可以把它部署到中央仓库,这样别人使用就会方便很多。接下来,我们就来看看如何使用maven发布自己依赖到中央仓库吧。
由于原先的sonatype网站已经退役,发布流程已经很大不一样。笔者只能根据官网摸着石头过河,一路踩坑才完成大业。
2.版本控制规则
先说下,对于发布的工具,我们还是要遵循基本的版本规则,采用常用的三段式。即
主版本号(Major version).次版本号(Minor version).修订号(Revision number)
如:1.2.3
- 主版本号:版本的主要变更,通常添加新特性会增加主版本号,如从1升级到2.
- 次版本号:版本的次要变更,修复bug或增加小特性会增加次版本号,如从2.1升级到2.2.
- 修订号:版本的微小变更,通常修复bug或优化功能会增加修订号,如从2.2.1升级到2.2.2.
3.注册Sonatype账户
3.1Sonatype介绍
Sonatype是一家软件公司,专注于提供Maven和Nexus仓库管理工具。Sonatype负责管理和维护Maven中央仓库。该仓库是Maven生态系统中最重要的公共仓库之一,包含了大量的开源Java项目和库。
原先的网站https://issues.sonatype.org/secure/Signup!default.jspa
官方已宣布退役,原文

3.2新注册网站
前往Maven Central: Search 注册,点击右上方的注册按钮。注册过程很简单,不详述。

3.3新建命名空间
注册成功,系统会弹出一个添加命名空间的界面。如果使用github账户登录,有可能不会弹出这个界面。因为系统自动会你创建一个 io.github.<your GitHub username>的命名空间。

发布依赖需要一个命名空间,也就是maven系统的groupId。如果自己没有申请公网域名的话,可以使用github这个免费域名。

3.4验证命名空间
在自己的github上创建一个临时项目,证明域名是自己的(临时仓库名字系统会提供,域名验证成功后可以删除)。

创建之后,等待一会会,可以看到命名空间的状态变为已验证

4.修改pom文件
根据sonatype的官方要求,修改项目的pom文件,参考下 官方对发布项目的基本要求
4.1增加标签
主要需要添加几个标签,如下所示
<issueManagement><system>GitHub Issues</system><url>https://github.com/kingston-csj/jforgame/issues</url></issueManagement><scm><connection>scm:git:https://github.com/jforgame/jforgame.git</connection><developerConnection>scm:git:git@github.com:jforgame/jforgame.git</developerConnection><url>https://github.com/jforgame/jforgame</url></scm><licenses><license><name>Apache License, Version 2.0</name><url>http://www.apache.org/licenses/LICENSE-2.0.txt</url><distribution>repo</distribution></license></licenses><developers><developer><id>kingston-csj</id><name>kingston</name><email>definemyself@163.com</email><organizationUrl>https://github.com/kingston-csj</organizationUrl><roles><role>owner</role><role>developer</role></roles></developer></developers>
4.2部署包带上source文件和doc文件
sonatype要求部署的包要附带源代码及API文档,即增加两个文件
example-application-1.4.7-sources.jar
example-application-1.4.7-javadoc.jar
只需在pom文件加两个插件即可
<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>
4.3提供文件校验码
对每个上传的文件(除了asc文件),需要附加校验码文件(md5+sha1)。
后文介绍(central-publishing-maven-plugin插件内嵌本功能)
假设你上传的文件为
example-application-1.4.7.pom
example-application-1.4.7.jar
example-application-1.4.7-sources.jar
example-application-1.4.7-javadoc.jar
需要部署的文件为
example-application-1.4.7.pom.md5
example-application-1.4.7.pom.sha1
example-application-1.4.7.jar.md5
example-application-1.4.7.jar.sha1
example-application-1.4.7-sources.jar.md5
example-application-1.4.7-sources.jar.sha1
example-application-1.4.7-javadoc.jar.md5
example-application-1.4.7-javadoc.jar.sha1
5.GPG签名
GPG(GNU Privacy Guard)是一种加密和签名工具,常用于软件包的签名和验证。在Maven中,GPG签名用于确保发布到远程仓库的依赖是经过验证和可信的。若希望发布依赖到远程仓库,需要进行GPG签名。
5.1下载GPG秘钥
前往官网下载 --> gpg下载

5.2创建密钥
使用Kleopatra(GPG可视化工具),创建密钥
点击文件->新建OpenGPG秘钥对,输入名称和邮箱,勾选“使用密码句保护生成的密钥”

生成之后,右键证书,选择“在服务器上发布”
也可以选择使用命令行
gpg --keyserver keyserver.ubuntu.com --send-keys yourPublicKey
6.使用maven部署
6.1sonatype生成用户token
在 sonatype 生成用户token

6.2setting文件添加server
maven配置文件setting.xml添加生成的token
<settings><servers><server><id>central</id><username>token-username</username><password>token-password</password></server></servers>
</settings>
6.3setting文件添加gpg签名
<settings><profiles><profile><id>ossrh</id><activation><activeByDefault>true</activeByDefault></activation><properties><gpg.executable>gpg</gpg.executable><gpg.passphrase>the_pass_phrase</gpg.passphrase></properties></profile></profiles>
</settings>
6.4修改pom文件的版本号
在多模块应用,版本号一般下载最顶层的pom.xml里。见<properties>的<revision>标签。
<groupId>io.github.jforgame</groupId><artifactId>jforgame-parent</artifactId><version>${revision}</version><packaging>pom</packaging><name>jforgame-parent</name><url>https://github.com/jforgame/jforgame</url><properties><revision>1.0.0</revision></properties>
在发布的时候,如果手动挨个修改版本号超麻烦。可以使用maven的版本插件,直接在项目根pom.xml目录下,使用以下命令就能轻松设置工程等的版本。
mvn versions:set -DnewVersion="1.0.0"
6.5使用maven发布插件
使用依赖可以方便对依赖进行发布,详情见官网--> sonatype依赖部署插件
父pom文件加入插件申明
<build><plugins><plugin><groupId>org.sonatype.central</groupId><artifactId>central-publishing-maven-plugin</artifactId><version>0.4.0</version><extensions>true</extensions><configuration><publishingServerId>central</publishingServerId><tokenAuth>true</tokenAuth></configuration></plugin><plugins>
</build>
其中publishingServerId 标签代表的serverId是配置在maven安装目录config下的setting.xml。
注意:项目采用多模块,如果不想部署全部子模块,只需要在父pom文件的<modules>标签注释掉过滤的模块即可。
在根目录下,执行
mvn deploy -DskipTests
6.6sonatype网站真正发布
执行成功之后,在sonatype网站可以看到上传的bound文件。

选择“Publish”按钮就可以完成发布啦。 
发布之后,泡杯茶,回来就可以在中央仓库,找到自己的代码了。

6.7项目中使用
pom文件使用中央仓库(其他仓库同步仍需时间)
<repositories><repository><id>central</id><name>central</name><url>https://repo1.maven.org/maven2</url><releases><enabled>true</enabled></releases></repository>
</repositories>>
引入依赖
<dependency><groupId>io.github.jforgame</groupId><artifactId>jforgame-socket-netty</artifactId><version>1.0.0</version>
</dependency>
一行代码即可创建socket网络服务
TcpSocketServerBuilder.newBuilder().bindingPort(HostAndPort.valueOf(ServerConfig.getInstance().getServerPort())).setMessageFactory(GameMessageFactory.getInstance()).setMessageCodec(new StructMessageCodec()).setSocketIoDispatcher(new MessageIoDispatcher(ServerScanPaths.MESSAGE_PATH)).build().start();
相关文章:
Maven发布开源框架到远程仓库
1.背景 当你写了一个自我感觉良好的开源工具希望给他人分享,如果只是在github等网站进行公布之外,用户使用起来还不是很方便,特别是当你提供是特定领域的基础工具。你还可以把它部署到中央仓库,这样别人使用就会方便很多。接下来…...
Qt创建窗口选择的三个父类介绍 ----- QWidget、QMainWindow、QDialog
QWidget类 简介 QWidget是Qt中所有用户界面元素的基类。它提供了窗口的基本功能,并允许用户自定义窗口的外观和行为。QWidget可以包含其他QWidget子类的子窗口,从而实现复杂的用户界面。 特性 提供了窗口的基本功能,包括绘制、事件处理、…...
论文翻译 - Defending Against Alignment-Breaking Attacks via Robustly Aligned LLM
论文链接:https://arxiv.org/pdf/2309.14348.pdf Defending Against Alignment-Breaking Attacks via Robustly Aligned LLM Abstract1 Introduction2 Related Works3 Our Proposed Method3.1 Threat Model3.2 Our Proposed Method3.3 Practical Designs3.4 Theoret…...
Kafka总结问题
Kafka Kafka Kafka Kafka的核心概念/ 结构 topoic Topic 被称为主题,在 kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。topic 相当于消息的分配标签,是一个逻辑概念。主题好比是数据库的表࿰…...
【RPG Maker MV 仿新仙剑 战斗场景UI (八)】
RPG Maker MV 仿新仙剑 战斗场景UI 八 状态及装备场景代码效果 状态及装备场景 本计划在战斗场景中直接制作的,但考虑到在战斗场景中加入太多的窗口这不太合适,操作也繁琐,因此直接使用其他场景。 代码 Pal_Window_EquipStatus.prototype.…...
【PyQt】18 -菜单等顶层操作
顶层界面的使用 前言一、菜单栏1.1 代码1.2 运行结果 二、工具栏2.1 代码几种显示方法 2.2 运行结果 三、状态栏3.1 代码3.2 运行结果 总结 前言 1、介绍顶层菜单栏目的使用,但没有陆续绑定槽函数。 2、工具栏 3、状态栏 一、菜单栏 1.1 代码 #Author :…...
线性代数基础概念和在AI中的应用
基本概念 线性代数是数学的一个分支,专注于向量、向量空间(也称为线性空间)、线性变换和矩阵的研究。这些概念在数据科学、人工智能、工程学和物理学等多个领域都有广泛应用。以下是这些基本概念的详细解释和它们在数据处理和AI中的应用。 …...
elasticsearch _cat/indices docs.count is different than <index>/_count
今天遇到一个问题,kibana中看到文档数与下面语句查询到的不同 GET /_cat/count/jiankunking_xxxxx_product_expand_test?v GET /jiankunking_xxxxx_product_expand_test/_search?track_total_hitstrue语句查询结果 epoch timestamp count 1711433785 06:16…...
关系型数据库mysql(7)sql高级语句
目录 一.MySQL常用查询 1.按关键字(字段)进行升降排序 按分数排序 (默认为升序) 按分数升序显示 按分数降序显示 根据条件进行排序(加上where) 根据多个字段进行排序 编辑 2.用或(or&…...
计算机网络——网络基础1
网络基础一 1.初识网络 网卡也是一种文件,所以对于网络的编程也是一种文件操作; 早期由于不同的计算机之间要根据数据进行协作,但是计算机之间是独立的,所以使用了光驱或者软盘之类的进行协作;对于将计算机连…...
ERDUnet: An Efficient Residual Double-codingUnet for Medical Image Segmentation
ERDUnet:一种用于医学图像分割的高效残差双编码单元 摘要 医学图像分割在临床诊断中有着广泛的应用,基于卷积神经网络的分割方法已经能够达到较高的准确率。然而,提取全局上下文特征仍然很困难,而且参数太大,无法临床应用。为此,我们提出了一种新的网络结构来改进传统的…...
vue响应式基础
声明响应式状态 ref() 在组合式 API 中,推荐使用 ref() 函数来声明响应式状态: import { ref } from vueconst count ref(0) ref() 接收参数,并将其包裹在一个带有 .value 属性的 ref 对象中返回: const count ref(0)c…...
每天上万简历,录取不到1%!阿里腾讯的 offer 都给了哪些人?
三月天杨柳醉春烟~正是求职好时节~ 与去年秋招的冷淡不同,今年春招市场放宽了许多,不少企业纷纷抛出橄榄枝,各大厂的只差把“缺人”两个字写在脸上了。 字节跳动技术方向开放数10个类型岗位,研发需求占比60%,非研发新增…...
外包干了20天,技术退步明显.......
先说一下自己的情况,大专生,21年通过校招进入杭州某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…...
4核8G云服务器,阿里云要多少钱?
阿里云4核8G服务器优惠价格955元一年,配置为ECS通用算力型u1实例(ecs.u1-c1m2.xlarge)4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选,CPU采用Intel(R) Xeon(R) Platinum处理器,阿里云活动链接 aliyunfuwuq…...
数学分析复习:振荡型级数的收敛判别
文章目录 振荡型级数的收敛判别 本篇文章适合个人复习翻阅,不建议新手入门使用 振荡型级数的收敛判别 直观上,振荡型级数说的是级数各项有正有负,求和的时候可以相互抵消,故可能收敛 命题:Abel求和公式 设复数列 { …...
阿里CICD流水线Docker部署,将阿里镜像私仓中的镜像部署到服务器中
文章目录 阿里CICD流水线Docker部署,将阿里镜像私仓中的镜像部署到服务器中一、CICD流水线的初步使用可以看我之前的两篇文章二、添加部署任务,进行Docker部署,创建一个阿里的试用主机1、选择主机部署,并添加服务主机2、创建免费体…...
并发VS并行
参考文章 面试必考的:并发和并行有什么区别? 并发:一个人同时做多件事(射击游戏队友抢装备) 并行:多人同时处理同一件事(射击游戏敌人同时射击对方)...
C语言经典例题(8) --- 进制A+B、网购、及格分数、最高分数、计算一元二次方程
文章目录 1.进制AB2.网购3.及格分数4.最高分数5.计算一元二次方程 1.进制AB 题目描述: 输入一个十六进制数a,和一个八进制数b,输出ab的十进制结果(范围-231~231-1)。 输入描述: 一行,一个十六…...
两区域二次调频风火机组,麻雀启发式算法改进simulink与matlab联合
区域1结果 区域2结果 红色曲线为优化后结果〔风火机组二次调频〕...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
