如何从头搭建一个自己的java库并上传到maven官方仓库

创建代码

在代码库根目录执行maven命令,用于快速生成一个基础的Maven项目

mvn archetype:generate \-DgroupId=com.mycompany \-DartifactId=my-maven-project \-Dversion=1.0.0 \-DarchetypeArtifactId=maven-archetype-quickstart \-DinteractiveMode=false

这个命令会创建一个名为 my-maven-project 的简单的Maven项目,其中包含了一个pom.xml文件,和一个 src/main/java/com/mycompany 目录、其中有一个简单的 App.java 文件。

*注意,如果是为了发布到中央仓库,version不能标识为SNAPSHOT版本,因为maven不能发布SNAPSHOT版本,如果此处创建为SNAPSHOT,后面pom.xml里必须在发布前去掉SNAPSHOT

现在开始把你的代码搬到这个目录里,把你项目的依赖加到pom.xml里,此处过程省略

开始

网上有很多过时的文章,都是说要到sonatype的jira平台上提交的,就类似这篇:

手把手教你如何上传自己的组建到maven中央仓库_java怎么推送自己的库到maven仓库-CSDN博客

但是!2024年的流程已经变化了,最新的流程是只需要在sonatype网站注册一个账号,并且申请一个自己的namespace,就可以推送了,但是好像需要有自己的域名。或者更简单的方式是,使用第三方登录,授权登录自己在github、bitbucket等老牌git托管商的账号,这样连namespace都不用申请了,sonatype会直接给你分配一个根据你的托管商账号名字的namespace。

参考官方文档:

Register to Publish Via the Central Portal - The Central Repository Documentation

本文为了方便,我就直接使用github账号授权方式了

注册中央仓库账户

打开网址:

Maven Central

点击右上角的“登录”链接:

中央门户支持通过 Google 或 GitHub 进行社交登录。您还可以选择自己的用户名和密码。如果您选择使用社交登录帐户进行注册,Sonatype 将有权访问与您的社交登录帐户关联的电子邮件地址。

成功授权登录github账号后,就直接登录了,点击右上角账户下拉菜单里的“View Namespaces”,能查看到自己的namespace,就像这样

然后再点击右上角账户下拉菜单里的“View Account”,进入创建token页面,点击右侧的“Generate User Token”按钮,会弹出你的token,只显示一分钟,快速将内容复制下来

这个弹窗内部往下拉一点,是maven配置样例

这个配置内容可以直接拷贝到maven配置文件settings.xml的servers段配置里,但是请注意“${server}”必须替换为字符串“central”表示中央仓库

创建gpg密钥

确保您已经安装了GPG工具。如果没有,请访问GnuPG官方网站下载并安装。

生成GPG密钥对

gpg --gen-key

按照提示操作,创建一个密钥对,可能会要你输入密钥密码passphrase,这个密码后面也要配置到maven配置文件settings.xml里。记下本次生成的密钥ID,或者用这个命令查看,

gpg --list-keys

将公钥上传到公钥服务器,将YOUR_KEY_ID替换为您在第2步中生成的密钥ID,就是上面的生成结果里pub下长的那一串hash值

gpg --keyserver keyserver.ubuntu.com --send-keys YOUR_KEY_ID

如果您有多个密钥,本地 gpg 将使用第一个列出的签名密钥,如果您需要使用特定密钥,您可以在一个<configuration>部分内添加 gpg 密钥的详细信息,并使用本地settings.xml通过签名密钥名发现密码。举例:

pom.xml

<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><configuration><keyname>${gpg.keyname}</keyname><passphraseServerId>${gpg.keyname}</passphraseServerId></configuration></execution></executions></plugin></plugins>
</build>

settings.xml

<profiles><profile><id>central</id><activation><activeByDefault>true</activeByDefault></activation><properties><gpg.executable>gpg</gpg.executable><gpg.keyname>YOUR_KEY_ID</gpg.keyname><gpg.passphrase>YOUR_KEY_PASSWORD</gpg.passphrase></properties></profile>
</profiles>

pom.xml修改

pom.xml需要做发布配置

<developers><developer><name>xxx</name><email>xxx@zzz.com</email><url>https://github.com/xxx</url></developer>
</developers><licenses><license><name>The Apache Software License, Version 2.0</name><url>http://www.apache.org/licenses/LICENSE-2.0.txt</url><distribution>repo</distribution><comments>The Apache Software License, Version 2.0</comments></license>
</licenses><scm><connection>scm:git:https://github.com/xxx/yyy.git</connection><developerConnection>scm:git:https://github.com/xxx/yyy.git</developerConnection><url>https://github.com/xxx/yyy</url>
</scm><distributionManagement><snapshotRepository><id>central</id><url>https://s01.oss.sonatype.org/content/repositories/snapshots</url></snapshotRepository><repository><id>central</id><url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url></repository>
</distributionManagement><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><autoPublish>true</autoPublish></configuration></plugin><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><configuration><keyname>${gpg.keyname}</keyname><passphraseServerId>${gpg.keyname}</passphraseServerId></configuration><gpgArguments><arg>--pinentry-mode</arg><arg>loopback</arg></gpgArguments></execution></executions></plugin><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>

maven配置修改

修改settings.xml

<settings><servers><server><id>central</id><username>token-username</username><password>token-password</password></server></servers>
<profiles><profile><id>central</id><activation><activeByDefault>true</activeByDefault></activation><properties><gpg.executable>gpg</gpg.executable><gpg.keyname>YOUR_KEY_ID</gpg.keyname><gpg.passphrase>YOUR_KEY_phrase</gpg.passphrase></properties></profile>
</profiles>
</settings>

开始发版

命令行下进入你的本地项目目录,执行命令

mvn deploy

maven会执行一系列的操作,比如运行测试用例、检查代码合规等,最后会报出有哪些问题需要整改,按照问题提示逐一百度改之即可

查看发布进展

本地命令执行成功的话,可以到这个网址看看publish情况

Maven Central: Publishing

可能会显示你的版本“PUBLISHING”,时间不应超过几分钟。单击“REFRESG”按钮可查看最新过程的状态。如果您的组件不满足所有要求,您的部署将失败,部署卡的右侧列(标记为“验证结果”)将详细说明哪些验证失败。

发布成功

发布成功后,可以到官方仓库首页搜索你的项目名字试试:

Maven Central

gpg密钥的导入、导出

由于主机上可以保存多对GPG秘钥对,因此我们需要注意公钥和私钥是成对匹配的

查看主机上的公钥
gpg --list-keys
查看主机上的私钥
gpg --list-secret-keys我们假定公钥的hash是81451E9950A283EC93FC270736C7920BBBAF1229导出公钥
gpg --armor --output gpg.pub --export 81451E9950A283EC93FC270736C7920BBBAF1229
导出私钥
gpg --armor --output gpg.key --export-secret-keys 81451E9950A283EC93FC270736C7920BBBAF1229先删除私钥
gpg --batch --yes --delete-secret-keys  81451E9950A283EC93FC270736C7920BBBAF1229
后删除公钥
gpg --batch --yes --delete-keys  81451E9950A283EC93FC270736C7920BBBAF1229导入公钥
gpg --import  --pinentry-mode loopback --batch gpg.pub
导入私钥
gpg --import  --pinentry-mode loopback --batch gpg.key

处理过期的密钥

生成密钥时,密钥会生成有效期限。在此期限之后,您可以编辑现有密钥以延长其有效时间。

编辑密钥,进入编辑对话
$ gpg --edit-key CA925CD6C9E8D064FF05B4728190C4130ABA0F98
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.Secret key is available.sec  rsa3072/8190C4130ABA0F98created: 2021-06-23  expires: 2023-06-23  usage: SC  trust: ultimate      validity: ultimate
ssb  rsa3072/4656B4857C17C93Bcreated: 2021-06-23  expires: 2023-06-23  usage: E   
[ultimate] (1). Central Repo Test <central@example.com>只有一个键可以编辑,直接选择它,输入1:
gpg> 1sec  rsa3072/8190C4130ABA0F98created: 2021-06-23  expires: 2023-06-23  usage: SC  trust: ultimate      validity: ultimate
ssb  rsa3072/4656B4857C17C93Bcreated: 2021-06-23  expires: 2023-06-23  usage: E   
[ultimate] (1)* Central Repo Test <central@example.com>您将看到*后面的 (1),这表示您已选择此密钥进行编辑。要编辑密钥过期时间,请输入以下命令:
gpg> expire
Changing expiration time for the primary key.
Please specify how long the key should be valid.0 = key does not expire<n>  = key expires in n days<n>w = key expires in n weeks<n>m = key expires in n months<n>y = key expires in n years
Key is valid for? (0) 输入您需要的内容,例如9m(9 个月),然后确认。系统会要求您提供该密钥的密码。关于编辑的最后一步是保存您所做的事情:
gpg> save现在您可以看到密钥的过期时间已更新:
$ gpg --list-keys
/home/mylocaluser/.gnupg/pubring.kbx
---------------------------------
pub   rsa3072 2021-06-23 [SC] [expires: 2022-03-21]CA925CD6C9E8D064FF05B4728190C4130ABA0F98
uid           [ultimate] Central Repo Test <central@example.com>
sub   rsa3072 2021-06-23 [E] [expires: 2023-06-23]最后,再次分发你的公钥:
gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16213.shtml

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

相关文章

分享一个用AI降本的思路,不懂代码也能上手

如何用AI解决实际的业务问题&#xff1f; 生财圈友我来利用ChatGPT做算法建模&#xff0c;每年为公司省下6万元。 今天他将分享通过ChatGPT进行数据分析的思路&#xff0c;从最开始定义问题到最终数据论证。 上手的实操过程门槛并不高&#xff0c;但可以实现把官方电商平台的…

c++ 虚函数常见问题

1 虚函数&#xff0c;虚表基础 虚函数&#xff0c;虚表基础 2 虚函数表保存在哪里 ? 虚函数表在编译的时候确定。在 linux 下&#xff0c;保存在只读数据段的重定位段&#xff0c;这个段的名字是 .data.rel.ro。 如下代码&#xff0c;编译之后&#xff0c;使用 readelf -t a…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称&#xff1a;仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称&#xff1a;仿《Q极速体育》NBACBA体育直…

网络攻防概述(基础概念)

文章目录 APTAPT概念APT攻击过程 网络空间与网络空间安全网络空间(Cyberspace)网络空间安全(Cyberspace Security) 网络安全属性机密性(Confidentiality或Security)完整性(Integrity)可用性&#xff08;Availability&#xff09;不可否认性&#xff08;Non-repudiation&#xf…

如何学习计算机网络(超详细,方法论)

分享一下学习计算机网络的方法论 首先是看视频&#xff1a; 这里我推荐中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版》课程 课程目标_哔哩哔哩_bilibili 教材采用神书《计算机网络&#xff08;自顶向下方法&#xff09;》&#xff0c;授课风格更偏向实…

企业如何正确地利用LLM大模型?

大型语言模型 (LLM) 不值得信任。就是这样。 考虑到它们先进的 AI 能力以及当今强大的基础模型的普遍知识&#xff0c;这似乎是一件令人惊讶的事情。然而&#xff0c;问题的关键在于 LLM 无法解释其输出。你不能信任 LLM 的结果&#xff0c;不是因为它不准确&#xff0c;而是因…

无畏并发: Rust Mutex的基本使用

并发是很多编程语言避不开的一块主要内容&#xff0c;主打一个无畏并发的Rust自然也面临这样的挑战。Rust中的Mutex提供了强大的同步原语&#xff0c;确保共享数据的线程安全&#xff0c;这篇文章中&#xff0c;我们会探讨Mutex的使用&#xff0c;从基础的用法到一些高阶内容。…

2024电工杯B题平衡膳食食谱的优化设计及评价原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024电工杯数学建模B题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 10 一、问题重述 14 二&#xff0e;问题分析 …

Python学习---基于HTTP的服务端基础框架搭建案例

整体功能&#xff1a; 1 创建框架构建相关的文件夹 2 创建app,模块文件 3 在 app模块文件中创建application函数(用于处理请求) 4 将request_handler()中的处理逻辑交由app模块的application函数完成 5 app模块的 application函数返回响应报文 6 在application 文件夹中创建一个…

淘工厂订单导出自动化工具

目录 下载安装与运行 主要目的 其他工具的弊端 本工具的优势 视频演示 下载新版后的注意事项 支持的导出项 什么叫一单多拍 常见问题 如何实现快捷登录 导出卡住时如何操作 如何精确导出 下载安装与运行 下载、安装与运行 语雀 主要目的 导出订单信息&#xf…

知识分享:隔多久查询一次网贷大数据信用报告比较好?

随着互联网金融的快速发展&#xff0c;越来越多的人开始接触和使用网络贷款。而在这个过程中&#xff0c;网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么&#xff0c;隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…

某钢铁企业数字化转型规划案例(114页PPT)

案例介绍&#xff1a; 该钢铁企业的数字化转型案例表明&#xff0c;数字化转型是钢铁企业应对市场竞争、提高生产效率、降低成本、优化资源配置和降低能耗排放的重要手段。通过引入先进的技术和管理理念&#xff0c;加强员工培训和人才引进&#xff0c;企业可以成功实现数字化…

欢乐钓鱼大师游戏攻略:自动钓鱼技巧!

《欢乐钓鱼大师》是一款极具趣味性和挑战性的钓鱼模拟游戏&#xff0c;为玩家提供了一个体验钓鱼乐趣的虚拟世界。从湖泊到河流&#xff0c;再到广袤的海洋&#xff0c;游戏中的各种钓场让人流连忘返。无论是新手钓友&#xff0c;还是经验丰富的老钓手&#xff0c;都可以在游戏…

k8s集群中pod的容器资源限制和三种探针

一、资源限制 总结&#xff1a; requests表示创建pod时预留的资源&#xff0c;limits表示pod能够使用资源的最大值。requests值可以被超&#xff0c;limits值不能超过&#xff0c;如果是内存使用超过limits会触发oom然后杀掉进程&#xff0c;如果是cpu超过limits会压缩cpu的使用…

20.SkyWalking

一.简介 SkyWalking用于应用性能监控、分布式链路跟踪、诊断&#xff1a; 参考连接如下&#xff1a; https://github.com/apache/skywalking https://skywalking.apache.org/docs/ 二.示例 通过官网连接进入下载页面&#xff1a;https://archive.apache.org/dist/skywalkin…

揭秘章子怡成功之路:她是如何征服世界的?

章子怡的演艺生涯可谓是一部传奇❗❗❗ 从一个普通工人家庭的女孩&#xff0c;到如今的国际巨星 她的每一步都充满了努力和汗水 她的舞蹈基础为她日后的演艺事业奠定了坚实的基础 而她对戏剧和电影的热爱更是让她在演艺道路上不断前行 从《我的父亲母亲》到《卧虎藏龙》&…

代码随想录|Day55|动态规划 part15|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 class Solution: def isSubsequence(self, s: str, t: str) -> bool: dp [[0] * (len(t) 1) for _ in range(len(s) 1)] for i in range(1, len(s) 1): for j in range(1, len(t) 1): if s[i - 1] t[j - 1]: dp[i][j] dp[i - 1][j - 1] 1 else: dp[i…

【UE5.1 角色练习】06-角色发射火球-part2

目录 效果 步骤 一、火球生命周期 二、添加可被伤害的NPC 三、添加冲量 在上一篇&#xff08;【UE5.1 角色练习】06-角色发射火球-part1&#xff09;基础上继续实现角色发射火球相关功能 效果 步骤 一、火球生命周期 为了防止火球没有命中任何物体而一直移动下去&#…

【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)

基于FastadminThinkPHP和Uniapp开发的赛事报名系统&#xff0c;包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言&#xff1a;赛事报名系统的重要性 在举办各类赛事时&#xff0c;一个高效便捷的报名系统对于组织者和参与者来说都至关重…

WebService的wsdl详解

webservice服务的wsdl内容详解&#xff0c;以及如何根据其内容编写调用代码 wsdl示例 展示一个webservice的wsdl&#xff0c;及调用这个接口的Axis客户端 wsdl This XML file does not appear to have any style information associated with it. The document tree is shown…