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

news2024/9/29 23:36:29
1.背景

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

  • 引用格式如下:
<!-- 这是引用rocketmq的坐标 -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>5.3.0</version>
</dependency>
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创建好仓库之后的操作一致
验证通过后可以删除这个域名解析

4.安装gpg
  • GPG Windows版下载
    在这里插入图片描述
  • 双击“gpg4win-4.3.1.exe”安装即可,具体过程省略
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:开发者信息按自己的实际情况填写

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, 这时项目就已经发布到中央仓库了
注意:发布成功的项目不能删除,也不能再次发布了

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.coloradmin.cn/o/2136791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

炫酷HTML蜘蛛侠登录页面

全篇使用HTML、CSS、JavaScript&#xff0c;建议有过基础的进行阅读。 一、预览图 二、HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…

ESP8266做httpServer提示Header fields are too long for server to interpret

CONFIG_HTTP_BUF_SIZE512 CONFIG_HTTPD_MAX_REQ_HDR_LEN1024 CONFIG_HTTPD_MAX_URI_LEN512CONFIG_HTTPD_MAX_REQ_HDR_LEN由512改为1024

C++ | Leetcode C++题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isLeafNode(TreeNode* node) {return !node->left && !node->right;}int sumOfLeftLeaves(TreeNode* root) {if (!root) {return 0;}queue<TreeNode*> q;q.push(root);int ans 0;while …

氢能源多旋翼无人机技术详解

1. 技术背景与优势 随着全球对低碳、环保和高效能源解决方案的需求日益增长&#xff0c;氢能源作为一种清洁、高效的能源形式&#xff0c;在多个领域展现出巨大的应用潜力。在无人机领域&#xff0c;氢能源多旋翼无人机因其独特的优势逐渐受到关注。相比传统锂电池无人机&…

Linux sh命令

目录 一. 基本语法二. 选项2.1 -c 字符串中读取内容&#xff0c;并执行2.1.1 基本用法2.1.2 获取当前目录下失效的超链接 2.2 -x 每个命令执行之前&#xff0c;将其打印出来2.3 结合Here文档使用 一. 基本语法 ⏹Linux 和 Unix 系统中用于执行 shell 脚本 或 运行命令 的命令。…

【我的 PWN 学习手札】Fastbin Double Free

前言 Fastbin的Double Free实际上还是利用其特性产生UAF的效果&#xff0c;使得可以进行Fastbin Attack 一、Double Free double free&#xff0c;顾名思义&#xff0c;free两次。对于fastbin这种单链表的组织结构&#xff0c;会形成这样一个效果&#xff1a; 如果我们mallo…

卡西莫多的手信

通过网盘分享的文件&#xff1a;卡西莫多的手信2022-2024.9.15-A5.pdf 链接: 百度网盘 请输入提取码 提取码: gig1

oracle数据库安装和配置详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Oracle 数据库是全球广泛使用的关系型数据库管理系统 (RDBMS)&#xff0c;提供高性能、可靠性、安全性和可扩展性&#xff0c;广泛应用于企业关键任务系统。下面详细介绍如何在 CentOS 系统上安装和配置 Or…

非金属失效与典型案例分析培训

随着生产和科学技术的发展&#xff0c;人们不断对高分子材料提出各种各样的新要求。因为技术的全新要求和产品的高要求化&#xff0c;而客户对产品的高要求及工艺理解不一&#xff0c;于是高分子材料断裂、开裂、腐蚀、变色等之类失效频繁出现&#xff0c;常引起供应商与用户间…

O2O营销,中小企业数字化转型的加速器

嘿&#xff0c;小伙伴们&#xff0c;今天咱们要聊的&#xff0c;可是那让中小企业焕发新生的O2O营销魔法&#xff01;它就像是一位时空穿梭者&#xff0c;轻松跨越线上与线下的鸿沟&#xff0c;带着商家们开启了一场数字化转型的奇妙之旅。 O2O营销&#xff1a;不只是连接&…

【主机入侵检测】Wazuh规则详解

前言 Wazuh 规则是一组用XML格式编写的条件&#xff0c;它们定义了应该如何解释日志数据。这些规则由Wazuh Manager使用&#xff0c;用于在日志消息中检测特定的模式或行为&#xff0c;并相应地生成警报或响应。它们在威胁检测中扮演着至关重要的角色&#xff0c;因为它们允许系…

NAS远程下载,Docker部署qBittorrent、Transmission、贝锐花生壳

与电脑不同&#xff0c;NAS通常都是7*24小时不间断运行&#xff0c;这使得下载资源变得更加便捷&#xff0c;解决了bt、pt下载需要长时间在线、挂机的问题。 所以&#xff0c;对于许多选择品牌NAS或自行搭建NAS系统的用户而言&#xff0c;像qBittorrent、Transmission这样的下载…

DAY 9 - 10 : 树

树的概念 定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个节点的有限集合T&#xff0c;它满足两个条件 &#xff1a; 1.有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点。 2.其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的…

rk3568 parameter.txt 添加自己的分区,或者去掉已有的分区

问题&#xff1a; 客户在 之前的核心板上 可以烧写自己的镜像&#xff0c;但是在最新的核心板上却烧写不上&#xff0c;新旧核心板 只是变了emmc &#xff0c; 由 江波龙 ------->星火。 分析&#xff1a; 客户的镜像的分区是经过自己的定制的&#xff0c;所以有可能 是 由…

Linux云计算 |【第三阶段】PROJECT1-DAY3

主要内容&#xff1a; Keepalived高可用、部署Ceph分布式存储 一、网站架构进阶项目案例 案例1&#xff1a;Keepalived高可用 延续 PROJECT1-DAY2 案例&#xff0c;部署两台代理服务器&#xff0c;实现如下效果&#xff1a; 1&#xff09;利用keepalived实现两台代理服务器的…

【Java面试】第十一天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 Springboot是如何实现自动配置的&#xff1f;Spring的Autowired能用在Map上吗&#xff1f;ListMapSet数组注意事项 Spring的AOP在什么场景下会失效&#xff1f; Springboot是如何实现自动配置的&#xff1f; Spring Bo…

【开源免费】基于SpringBoot+Vue.JS高校心理教育辅导系统(JAVA毕业设计)

本文项目编号 T 031 &#xff0c;文末自助获取源码 \color{red}{T031&#xff0c;文末自助获取源码} T031&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

嵌入式C语言自我修养:C语言的面向对象编程思想

⭐关联知识点&#xff1a;C和C的区别 代码复用与分层思想 什么是代码复用呢&#xff1f; &#xff08;1&#xff09;函数级代码复用&#xff1a;定义一个函数实现某个功能&#xff0c;所有的程序都可以调用这个函数&#xff0c;不用自己再单独实现一遍&#xff0c;函数级的代…

【YashanDB知识库】单机升级典型问题及应急措施

升级典型问题 官网升级操作指引 离线升级&#xff0c;一般线上操作之前需要照着做一遍&#xff0c;但是由于数据量少、monit进程在测试环境没有启动等原因&#xff0c;一些操作、配置问题在测试过程中不会暴露&#xff0c;在生成操作的时候才暴露&#xff0c;下面3项是比较常见…

你也喜欢“钓鱼“吗?

免责声明:本文仅做分享! 目录 什么是网络钓鱼 流程 攻击手法 0-隐藏自己 1-office宏 创建xxx.dotm 创建xxx.docx 2-RLO 自解压 3-快捷方式lnk 4-邮件伪造 Swaks Gophish 5-网站克隆 setoolkit nginx反向代理 前端页面克隆 6-wifi钓鱼 7-其他 防御 溯源 反…