如何将自己的项目发布到Maven中央仓库

ops/2024/9/19 10:17:02/ 标签: maven, java, Maven中央仓库, Sonatype, gpg
1.背景

本教程为2024年9月最新版
我有一个java项目想发布到maven中央仓库,然后任何人都可以在pom文件中引用我写的代码

  • 引用格式如下:
<!-- 这是引用rocketmq的坐标 -->
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version>
</dependency>
Sonatype_12">2.注册Sonatype账号

Maven中央仓库Sonatype维护,所以需要注册一个Sonatype账号

  • 地址: Maven中央仓库官网
  • 点击Sign in, 来到登录页
    在这里插入图片描述
    在这里插入图片描述
  • 如果你已经有账号了,填写用户名或邮箱、密码后点击Continue直接登陆即可
  • 如果你没有账号可以选择注册,点击Sign up即可进入注册页面,具体细节就不讲了
  • 没有账号也可通过Google账号或Github账号登录,前提是你有这些账号
3.创建命名空间(Namespace)

成功登录Sonatype后,需要创建至少一个命名空间,这是必须的
命名空间可作为日后上传项目的groupId
注意:上传项目的groupId必须是已经创建并审核通过的命名空间,否则无法上传
下面看看如何创建一个命名空间:

  • 点击用户名,再点击 View Namespaces 查看已有命名空间列表
    在这里插入图片描述
  • 然后点击 Add Namespace添加一个命名空间
    在这里插入图片描述
  • 填写命名空间名称,并提交
    在这里插入图片描述

命名空间名称是以“.”分隔的,这个名字不是随便取的,参考以下规则:

1.如果你有一个Github账号,则你可以创建一个io.github.xxx的命名空间,
其中“xxx”是你Github的用户名,可以登录到GitHub后查看个人主页的地址
比如“https://github.com/abc”的用户名就是“abc”,可以添加的命名空间为“io.github.abc”
Tips:如果你是通过GitHub登录Sonatype的,则会自动通过你的GitHub用户名创建一个命名空间,无需手动创建~
支持的代码库如下:

代码库命名空间示例
GitHubio.github.myusername
GitLabio.gitlab.myusername
Giteeio.gitee.myusername
Bitbucketio.bitbucket.myusername

2.如果你有一个自己的域名,则可以通过域名添加一个命名空间
比如你的域名是“www.abc.com”,则可以添加一个“com.abc”的命名空间

3.其他添加方式请参考官方文档:Namespace创建官网文档

  • 提交后会看到一个待验证的命名空间,下方展示了验证码
    在这里插入图片描述

验证方法,根据命名空间类型的不同验证方式也不同

3.1 Github的命名空间验证

如果是github的命名空间,验证方式就是登录对应用户名的GitHub账号,创建一个新的仓库
库的名称为提交命名空间时生成的验证码(y3shwin48v)

在这里插入图片描述
在这里插入图片描述

  • 仓库创建完毕后,回到Sonatype的命名空间页面点击验证
  • 在这里插入图片描述
    在这里插入图片描述
  • 这时命名空间的状态由“Unverified”变为了“Verification Pending”,表示正在验证中,等到状态变为“Verified”时则命名空间创建成功

Tips:1.之前在GitHub创建的仓库可以删除;2.已审核通过的命名空间不可删除(其他状态可删除),也不可以修改

3.2域名的命名空间验证

如果你是通过域名创建的命名空间,则需要到对应的域名注册服务商配置一个域名解析用于验证
假设你的域名是www.abc.com, 则你创建的命名空间为“com.abc”
登录域名服务商,为abc.com添加一个域名解析, 这里以阿里云为例:

  • 登录阿里云app
  • 进入域名解析
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

记录类型选“TXT”,主机记录选“@”,记录值填写提交命名空间时生成的验证码,填写完毕后保存即可
后续和GitHub创建好仓库之后的操作一致
验证通过后可以删除这个域名解析

gpg_80">4.安装gpg
  • GPG Windows版下载
    在这里插入图片描述
  • 双击“gpg4win-4.3.1.exe”安装即可,具体过程省略
gpg_84">5.gpg生成密匙
  • 安装完成后,cmd打开命令行

输入"gpg --version"验证是否安装成功,如下代表安装成功

C:\Users\LENOVO>gpg --version
gpg (GnuPG) 2.4.5
libgcrypt 1.10.3
Copyright (C) 2024 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.Home: C:\Users\LENOVO\AppData\Roaming\gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
  • 生成key命令:gpg --gen-key

填写Real name(姓名)和Email Address(邮箱,最好用真实的,也可用于密匙找回)
输入"O"回车,弹出弹窗,填写密码口令(自定义)两次,然后点击OK,密匙就创建好了

在这里插入图片描述

pub ed25519 2024-09-014 [SC] [expires: 2027-09-14]
1189GDSG89043SGDB8943ABCGDFGAADK78DHS
uid realName <email address>
sub cv25519 2024-09-14 [E] [expires: 2027-09-14]

此处生成的公钥为:1189GDSG89043SGDB8943ABCGDFGAADK78DHS

  • 发布公钥,命令:gpg --keyserver keyserver.ubuntu.com --send-keys <公钥>

如果出现发送失败的情况,可以选择其他服务器多次重试,总会成功的
中央服务器支持的GPG密钥服务器有:
keyserver.ubuntu.com
keys.openpgp.org
pgp.mit.edu

  • 验证公钥是否上传成功:gpg --keyserver keyserver.ubuntu.com --recv-keys <公钥>
  • 查看已有的公钥列表:gpg --list-keys
6.本地项目配置
6.1pom文件完整配置

假设我已有审核通过的命名空间:io.github.xxx
现上传项目名称:abc(注意:同一个项目的同一个版本只能在Maven中央仓库发布一次,要多次发布须升级版本号)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 项目坐标 --><groupId>io.github.xxx</groupId><artifactId>abc</artifactId><version>1.0.0</version><!-- 项目信息 --><name>abc</name><description>项目描述,不要乱写,会展示在Maven中央仓库官网</description><url>https://github.com/xxx/abc</url><!-- 打包方式 --><packaging>jar</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><build><plugins><!-- maven编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><!-- maven Source插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.3.1</version><executions><execution><id>attach-sources</id><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin><!-- maven Javadoc插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>3.10.0</version><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals></execution></executions></plugin><!-- gpg插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-gpg-plugin</artifactId><version>3.2.5</version><configuration><!-- 改成你自己的路径 --><executable>D:\ProgramFiles\GnuPG\bin\gpg.exe</executable></configuration><executions><execution><id>sign-artifacts</id><phase>verify</phase><goals><goal>sign</goal></goals></execution></executions></plugin><!-- 发布插件 --><plugin><groupId>org.sonatype.central</groupId><artifactId>central-publishing-maven-plugin</artifactId><version>0.5.0</version><extensions>true</extensions><configuration><publishingServerId>central</publishingServerId><!--<tokenAuth>true</tokenAuth>--><!-- 若要自动发布,添加以下配置 --><!--<autoPublish>true</autoPublish>--><!-- 一直等到发布完成 --><!--<waitUntil>published</waitUntil>--></configuration></plugin></plugins></build><!-- 版本控制 --><scm><url>https://github.com/xxx/zbc/tree/master</url><connection>scm:git:https://github.com/xxx/abc.git</connection><developerConnection>scm:git:https://github.com/xxx/abc.git</developerConnection></scm><!-- 开发者信息 --><developers><developer><name>xxx</name><email>xxx@gmail.com</email></developer></developers><!-- 开源协议 --><licenses><license><name>The Apache License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0.txt</url></license></licenses><!-- 官方maven配置文档 --><!-- https://central.sonatype.org/publish/publish-portal-maven/ -->
</project>
  • 其中需要修改的信息如下:
<groupId>io.github.xxx</groupId>
<artifactId>abc</artifactId>
<version>1.0.0</version><name>abc</name>
<description>项目描述</description>
<url>https://github.com/xxx/abc</url>

groupId:必须是已审核通过的命名空间,不能随意填写,否则上传失败
artifactId和name:都是项目名称,可自己取名
version:版本号,一个版本号只能在Maven中央仓库发布一次,版本号不能带“SNAPSHOT”,快照版不支持上传
description:项目描述,不要乱写,会展示在Maven中央仓库官网的项目描述上
url:项目地址,比如gitHub地址,没有的话就空着

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-gpg-plugin</artifactId><version>3.2.5</version><configuration><!-- 改成你自己的路径 --><executable>D:\ProgramFiles\GnuPG\bin\gpg.exe</executable></configuration><executions><execution><id>sign-artifacts</id><phase>verify</phase><goals><goal>sign</goal></goals></execution></executions>
</plugin>

executable: gpg的执行路径,改成自己的实际安装路径

<scm><url>https://github.com/xxx/zbc/tree/master</url><connection>scm:git:https://github.com/xxx/abc.git</connection><developerConnection>scm:git:https://github.com/xxx/abc.git</developerConnection>
</scm>
<developers><developer><name>xxx</name><email>xxx@gmail.com</email></developer>
</developers>

scm:版本控制https://后面的部分按自己项目的实际情况填写
developers:开发者信息按自己的实际情况填写

maven_settings_314">6.2maven settings文件完整配置
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><servers><!-- maven中央仓库 --><server><id>central</id><!-- 用户名和密码来自sonatype生成的User Token --><username>xxx</username><password>xxxxxxxxxxxxxxxxxxxxx</password></server></servers><mirrors><!-- 阿里云镜像仓库 --><mirror><id>alimanven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors><profiles><profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties></profile><profile><id>gpg</id><properties><!-- 本地gpg执行目录(注意和安装目录不是同一个,与安装目录最外层目录同级) --><gpg.executable>D:\ProgramFiles\GnuPG\bin</gpg.executable><!-- 创建密钥时的密码口令passphrase --><gpg.passphrase>xxxxxx</gpg.passphrase></properties></profile></profiles><activeProfiles><!-- 应用gpg profile --><activeProfile>gpg</activeProfile></activeProfiles>
</settings>
  • 其中需要修改的信息如下:
<servers><server><id>central</id><username>xxx</username><password>xxxxxxxxxxxxxxxxxxxxx</password></server>
</servers>

username和password来自Sonatype生成的UserToken
点击用户名,点击"View Account"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:这个弹窗一旦关闭后,就没法再次查看了,所以最好自己复制下来,保存在本地

<profile><id>gpg</id><properties><!-- 本地gpg执行目录(注意和安装目录不是同一个,与安装目录最外层目录同级) --><gpg.executable>D:\ProgramFiles\GnuPG\bin</gpg.executable><!-- 创建密钥时的密码口令passphrase --><gpg.passphrase>xxxxxx</gpg.passphrase></properties>
</profile>

gpg.executable: gpg执行目录,按实际情况修改
gpg.passphrase:这个口令就是之前用gpg生成key时输入的口令

在这里插入图片描述

7.上传项目到命名空间
  • 对项目执行maven命令: clean、deploy

可以用命令行也可以在IDEA中点击执行

在这里插入图片描述

BUILD SUCCESS 后则上传成功,不成功自行查看失败原因并处理

8.发布项目

上传成功后登录Sonatype查看

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

IDEA deploy成功后,此处的Deployments列表就能看到,状态为待发布VALIDATED
不想发布了可以点击Drop删除
发布则点击Publish, 状态会变成发布中PUBLISHING, 中间需要等待一个小时、几个小时,甚至一天,具体时间不定
发布成功后,状态会变为已发布PUBLISHED, 这时项目就已经发布到中央仓库了
注意:发布成功的项目不能删除,也不能再次发布了

maven_425">9.maven引用

发布成功后,全世界任何人都可以通过以下坐标引用你的项目了

<dependency><groupId>io.github.xxx</groupId><artifactId>abc</artifactId><version>1.0.0</version>
</dependency>

Tips:
https://mvnrepository.com/的同步比较慢,一般要3-5天才能搜索到(仅仅只是搜索不到而已,不影响别人引入和使用)
https://search.maven.org/ 在发布成功后就可以搜索到了


http://www.ppmy.cn/ops/110937.html

相关文章

AI基础 L21 Quantifying Uncertainty and Reasoning with Probabilities III

Bayesian Networks 1 Bayesian Networks • A Bayesian Network (BN) represents the dependencies among variables and encodes the full joint probability distribution concisely. • A BN is a directed graph, where each node is annotated with probability informati…

死锁例子学习

转自: 面试官&#xff1a;什么是死锁&#xff1f;如何解决死锁&#xff1f;写一段死锁的代码吧&#xff01;_哈工大分出了多少学校-CSDN博客 1.介绍 。产生死锁的原因&#xff0c;主要包括&#xff1a; 系统资源不足&#xff1b;如果系统资源充足&#xff0c;进程的资源请求…

HTTP反向代理教学:轻松实现代理IP的妙用

在当今互联网时代&#xff0c;代理IP已经成为了很多人上网必不可少的工具。无论是为了保护隐私&#xff0c;还是为了更好地管理网络流量&#xff0c;代理IP都能发挥重要作用。今天&#xff0c;我们就来聊聊HTTP反向代理这个神奇的东西&#xff0c;教你如何轻松实现代理IP的妙用…

windows环境下载ubuntu22.04源码,提示invalid path aux.c

git clone https://git.launchpad.net/~ubuntu-kernel/ubuntu/source/linux/git/jammy error: invalid path drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c 一、原因 aux.c 文件导致 error的原因与文件名有关。 在Windows中&#xff0c;aux 是一个保留名称&#xff0c;不能用…

MATLAB系列02:MATLAB基础

MATLAB系列02&#xff1a;MATLAB基础 2. MATLAB基础2.1 变量和数组2.2 MATLAB变量的初始化2.2.1 用赋值语句初始化变量2.2.2 用捷径表达式赋值2.2.3 使用内置函数来初始化2.2.4 使用关键字input来初始化 2.3 多维数组2.3.1 创建多维数组2.3.2 多维数组在内存中的存储2.3.3 用单…

速盾:cdn节点越多越好吗?

CDN&#xff08;内容分发网络&#xff09;是一种在全球范围内分布节点的网络架构&#xff0c;旨在提供更快速和可靠的内容传输和访问服务。在CDN中&#xff0c;内容被缓存到位于不同地理位置的节点上&#xff0c;使用户可以从最近的节点获取内容&#xff0c;从而减少延迟和网络…

【Linux 从基础到进阶】Docker Compose 编排工具使用

Docker Compose 编排工具使用 Docker Compose 是 Docker 官方提供的容器编排工具,允许用户通过定义简单的 docker-compose.yml 文件来管理多容器应用。Compose 主要用于定义和运行多容器 Docker 应用程序,可以简化多个服务的部署、扩展和维护。 本文将详细介绍 Docker Comp…

VPP配置网卡多队列no bufs问题

在VPP配置文件/etc/vpp/startup.conf中启用网卡的多队列功能&#xff0c;指定接收和发送队列的数量。 dpdk { dev default { num-rx-queues 4 num-tx-queues 4 } 在测试中发现如下情况&#xff0c;网卡的rx no bufs错误计数非常高。 vpp # show hardware-interfaces GigabitEt…

泽众P-One性能测试平台支持分布式全链路压测

在当今数字化转型加速的时代&#xff0c;高性能、高可用性的系统已成为企业竞争力的核心要素之一。为了确保系统能够在高并发、大数据量的环境下稳定运行&#xff0c;分布式全链路压测成为了不可或缺的一环。P-One凭借其强大的功能&#xff0c;支持分布式全链路压测&#xff0c…

prompt实用技巧-AI+Mermaid【酷炫钉钉文档】

AI 新技能&#xff0c;最近 chatGPTo1 发布后模型能力出现了新的跨越&#xff0c;之前模型的一本正经的胡说八道幻想模式&#xff0c;让AI 对待理科推理明显弱于文案的 AGI 的生成。 prompt engineer 工程师程序员的福音 prompt 内容如下&#xff0c; 按照以上格式生成创建公…

React源码学习(一):如何学习React源码

本系列源码学习&#xff0c;是基于 v16.13.1&#xff0c;v17.x与v16.x区别并不太大&#xff01; 一、如何正确的学习React源码&#xff1f; 找到Github&#xff0c;转到React仓库&#xff0c;fork / clone源码&#xff1a;React 查看Readme&#xff0c;在Documentation中有Cont…

第三章 转折25 实习生当主角

团队的2个实习同学&#xff0c;基本都入职有3个月了&#xff0c;都成了团队不可或缺的一份子。 首先&#xff0c;我并没有区别对待实习同学&#xff0c;我觉得6个月的实习期很长&#xff0c;可以做很多事情&#xff0c;有更多资源帮我、帮助公司是非常难得的&#xff0c;另外&…

Reactive 编程-Project Reactor

Reactive 编程与 Project Reactor Reactive 编程是一种编程范式&#xff0c;主要用于处理异步数据流。它旨在通过声明式的编程方式处理事件驱动的非阻塞任务&#xff0c;特别适合于构建响应式、可扩展、高并发的应用。随着互联网应用规模的扩大和响应速度的提升需求&#xff0…

Leetcode面试经典150题-79.搜索单词

题目比较简单&#xff0c;回溯最基础的题&#xff0c;记得除非覆盖&#xff0c;否则一定要恢复现场就行 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean exist(char[][] board, String word) {int m board.length; int n board[0].length;i…

JS 扩展运算符有哪些使用场景?

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 扩展运算符有哪些使用场景&#xff1f;直接进入正题 一、复制数组 const a1 [1, 2];// 写法一 const a2 [...a1]; // 写法二 const [...a2] a1;二、合并数组 const part1 [1, 2, 3]; const part2 …

Python 数学建模——ARMA 时间序列分析

文章目录 前言使用前提平稳性检验白噪声检验 用法代码实例第一步——平稳性分析方法一方法二方法三 第二步——白噪声分析第三步——确定参数第四步——模型构建与检验检验模型效果预测未来数据 前言 常见的时间序列分析方法有很多&#xff0c;之前介绍了一个稍微新颖的 Prophe…

HarmonyOS开发者基础认证试题

文章目录 一、HarmonyOS介绍二、DevEco Studio的使用三、ArkTS语法介绍四、应用程序框架基础五、从简单的页面开始六、构建更加丰富的页面七、从网络获取数据八、保存应用数据 一、HarmonyOS介绍 判断题&#xff1a; 1.“一次开发&#xff0c;多端部署”指的是一个工程&#x…

【GBase 8c V5_3.0.0 分布式部署(单机安装)】

GBase 8c数据库分布式形态采用share nothing的分布式架构&#xff0c;计算节点和存储节点分离。节点间通过高速网络进行通信&#xff0c;所有节点都有主从互备&#xff0c;确保系统的极致高可用。 本文主要包含GBase 8c V5_3.0.0 分布式部署(单机安装)的简单流程&#xff0c;供…

AI创意引擎:优化Prompt提示词的高效提问技巧

AI内容创作的精髓&#xff1a;提示词&#xff08;Prompt&#xff09; 在AI领域中&#xff0c;提示词&#xff08;Prompt&#xff09;是与模型沟通的关键工具。提示词不仅决定了AI生成内容的方向和质量&#xff0c;还在优化模型输出、提升用户体验中扮演着至关重要的角色。因此…

【pgAdmin4】使用psql命令行执行查询时,使用占位符(:v1)传入参数

目录 0.环境 1.相关知识点 2.举例 3.详细操作 0.环境 windows11 pgAdmin4 8.10 1.相关知识点 占位符如何理解&#xff1f; SQL语句中的占位符是一种用于代表参数的特殊符号&#xff0c;通常以"?"或":"开头。它们被用来构建可重用的SQL语句&#xff0…