一键搞定发布自己Jar到Maven中央仓库

news2024/12/26 14:02:36

做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar
然后发布到maven中央仓库给别人使用。

hhh 我感觉自己写一个jar包工具然后,被很多人使用是一件很牛,很快乐事情。

终于有了这个机会,和时间。SpringBoot stater出来了 基于场景启动器你可以轻松定义自己的stater组件,然后甚至,可以发布到maven仓库。供大家使用。

我总结,写了一个作为我工作多年程序员,自己工具类库,stater。

Github地址

基于它,你可以轻松开发SpringBoot WEB API,提高效率。不在去关心一些繁琐。重复工作,而是把重点聚焦到业务。

回到正题,这篇文章基于我这个,stater讲一下。如何把自己定义stater 发布到maven中央仓库。

注册 sonatype账号

进入 issues.sonatype.org 注册自己的账号,基于这个平台,快速发布到maven仓库

注册完成后记住,账号密码,后面发布需要使用授权

创建自己的maven项目工单

注册完成后我们创建自己,发布的maven项目,点击新建

项目选择:Community Support - Open Source Project Repository Hosting (OSSRH)

问题类型选择:New Project

*的是必填项,其余留空或者保持默认即可,然后新建工单等待管理员审核

项目地址填一个你的项目的Github仓库地址。这里还是强调一下组id的填写,组id需要根据你自己的域名或者开源仓库地址来填。

后面在问题-我的报告中可以追踪issue的审核情况

等待管理员审核。审核完成,管理员会在下面提示你让你验证这个域名是你的或者证明gitee或者github空间是你的

关闭maven工单项目

maven工单项目审核通过后,会有邮件提醒。

新建成功issue后需要等待Sonatype的工作人员进行审核,审核时间大约几分钟左右(我当时5min貌似有人几小时的…),审核通过后issue的Status会转变为Resolved,此时你就可以进行下一步操作了

你点击问题—找到你自己新建的项目

然后点击Respond按钮开启工单,让管理员去验证。

等待验证完成,管理员就会接着回复你验证成功,这就说明你的工单通过了,可以上传项目了

如果是用域名,则管理员会让你给你的域名添加一个TXT解析,然后他来验证:

没问题,这个时候可以关闭问题

项目配置

maven 配置

在你maven配置文件中配置你注册issues.sonatype.org账号密码

在maven 的conf文件夹下settings.xml 文件的servers节点配置如下

 <server>
      <id>snapshots</id>
      <username>kenx</username>
      <password>xxxx</password>
    </server>
    <server>
      <id>releases</id>
      <username>kenx</username>
      <password>xxxx</password>
    </server>
    <server>
      <id>ossrh</id>
      <username>kenx</username>
      <password>xxx</password>
    </server>

秘钥配置

使用gpg生成秘钥

上传项目需要秘钥签名认证。本地需要生成密码。并且把公钥上传服务。

生成秘钥

gpg --gen-key

运行后gpg要求你选择加密算法,过期时间等等,这些直接选择默认值即可。通过对比发现,gpg 2.0以上的版本运行gpg --gen-key命令 会跳过这些步骤。

之后gpg要求你输入姓名,邮箱以及关键的Passphrase(这个密码要自己记住,后面有用),依次输入即可。然后gpg为你生成了一对秘钥。

查看秘钥

gpg --list-keys

在pub字段下面有一个十六进制数,那就是这个秘钥的ID

然后我们要把这个秘钥上传至公钥服务器,使用如下命令:

gpg --keyserver keyserver.ubuntu.com --send-keys 秘钥ID

验证是否成功地上传到了服务器:

gpg --keyserver keyserver.ubuntu.com --recv-keys 秘钥ID

如果两条命令执行输出结果都如下说明成功:

这样,就完成了秘钥的配置了。

修改项目pom配置

接下来我们需要配置我们项目中pom 文件,

<groupId>cn.soboys</groupId>
    <artifactId>rest-api-spring-boot-starter</artifactId>
    <version>1.3.0</version>
    <packaging>jar</packaging>
    <name>rest-api-spring-boot-starter</name>
    <description>SpringBoot Easy Fast Rest WEB 提高SpringBoot Web开发工作效率 RestFull API使用 全局错误拦截,参数校验, 错误国际化 ,自定义错误响应 ,业务异常断言 ,Redis 工具库使用 ,RestTemplate 请求工具 ,日志使用 ,集成mybatisPlus一键代码生成</description>
    <url>https://github.com/coder-amiao/rest-api-spring-boot-starter</url>

    <!-- 项目设定 -->
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <gpg.passphrase>1234qwer</gpg.passphrase>
        <gpg.keyname>E933FBC878FB2EC0900A2ABAF79C3CD9E9E6A8EF</gpg.keyname>
        <gpg.homedir>/Users/xiangyong/.gnupg</gpg.homedir>
    </properties>



    <!-- 许可证信息,这里是Apache 2.0的许可证,大家根据实际情况修改 -->
    <licenses>
        <license>
            <name>The Apache Software License, Version2.0</name>
            <url>https://www.apache.org/licenses/</url>
            <distribution>repo</distribution>
        </license>
    </licenses>


    <!--   开发人员信息         -->
    <developers>
        <developer>
            <name>三时</name>
            <email>xymarcus@163.com</email>
        </developer>
    </developers>

    <!--   项目仓库信息         -->
    <scm>
        <connection>scm:git:https://github.com/zw201913/jtile38.git</connection>
        <developerConnection>https://github.com/coder-amiao/rest-api-spring-boot-starter</developerConnection>
        <url>https://github.com/coder-amiao/rest-api-spring-boot-starter.git</url>
        <tag>v${project.version}</tag>
    </scm>

    <!-- 中央仓库地址配置,不需要修改 -->
    <distributionManagement>
        <snapshotRepository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>

        <repository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- Source -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- Javadoc工具 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.10.4</version>
                <configuration>
                    <additionalJOptions>
                        <additionalJOption>-Xdoclint:none</additionalJOption>
                    </additionalJOptions>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- GPG -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-gpg-plugin</artifactId>
                <version>1.6</version>
                <configuration>
                    <gpgArguments>
                        <arg>--pinentry-mode</arg>
                        <arg>loopback</arg>
                    </gpgArguments>
                </configuration>
                <executions>
                    <execution>
                        <id>sign-artifacts</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>sign</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

注意配置的groupId, 必须和你之前创建的maven项目工单保持一致

pom.xml 中必须包括:name、description、url、licenses、developers、scm 等基本信息,使用了 Maven 的 profile 功能,只有在 release 的时候,创建源码包、文档包、使用 GPG 进行数字签名。

此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。

如果是多模块项目的话,只需要在父 pom.xml 中声明这些,子 pom.xml 中只需要修改相应的一些信息,如 name 标签。

项目发布

接下来你可以使用deploy 发布项目

或者命令

mvn clean deploy

发布项目到中央仓库

上面的步骤只是把项目传到了Sonatype上了,还没有发布出去。

进入s01.oss.sonatype.org,登录,账号是之前注册账号用户名和密码

点击旁边的Staging Repositories即可看到我们发布的项目。

勾选项目,点击close按钮,开始进行项目校验。

再点击下面的active标签可以查看close的进度:

显示All rules passed: Central Sync Requirement就说明校验通过,可以发布了。

如果过程正按钮是灰色,或者不能点击,重复刷新等待就行(有可能是网络等其他原因)。然后重复上面步骤。即可

再点击上面的release按钮即可发布到中央仓库了。

完成后,大约过个2个小时,你就可以在search.maven.org找到你的发布的项目了!

总结概括

以后发布项目,如果groupId不变的话,我们就不需要再去申请工单了。

直接重复上述的二、三、四步中的部分关键步骤即可。

上述settings.xml已经配置了servers,

就不用再次配置了,即第二步配置settings.xml可以省略了。秘钥也已经生成过了,也不需要再次生成了, 即第三步的秘钥生成也不需要了。不过如果更换了电脑,那就要重新配置settings.xml并重新生成并上传秘钥了。

关注公众号,程序员三时 持续输出优质内容 希望给你带来一点启发和帮助

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

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

相关文章

Steam搬砖项目介绍

Steam搬砖项目&#xff1a;轻松赚取稳定收入的副业选择 对于许多数字游戏玩家来说&#xff0c;Steam平台并不陌生。今天&#xff0c;我将向您介绍一个稳定的副业选择——Steam搬砖项目。通通过简单的操作&#xff0c;您可以轻松获得几十上百元的利润。 介绍 Steam搬运砖项目…

css 伪元素和浮动

展示为行内元素 inline-block <style>div {/* 浏览器解析行内块或行内标签的时候, 如果标签换行书写会产生一个空格的距离, 展示为行内元素 */display: inline-block;width: 100px;height: 100px;}.one {background-color: pink;}.two {background-color: skyblue;}</…

基于OpenCV 实现车牌号码识别--附免费源码

在本教程中,您将学习如何使用 OpenCV 和 EasyOCR 包自动执行车牌/车牌识别 (LPR/NPR)。 EasyOCR是一个开源 Python 包,用于执行光学字符识别 - OCR(从图像中提取文本)。 该软件包非常易于使用,在撰写本文时,它支持 80 多种语言,包括中文、阿拉伯语、法语、英语、西里尔…

多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warnin…

【脚本语言】Shell Script - 日期的获取、设置和延时操作

目录 基础概念 基础语法 打印当前日期 打印纪元时 将日期转换为纪元时 打印要求格式的日期 设置日期和时间 基础概念 Bash可以帮助我们以不同的格式打印日期、设置日期&#xff0c;又或根据日期或时间进行操作等。 在类Unix系统中&#xff0c;日期被存储为一个整数&#xff0…

阿里云服务器架构x86、GPU、ARM、裸金属和超级计算集群说明

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

在 CI/CD流水线中运行自动化单元测试的4个原因

目录 什么是单元测试&#xff1f; C#中的单元测试示例 我需要在CI/CD 流水线中运行自动化测试吗&#xff1f; 开发人员代码验证反馈循环 预验证 步步为营 减少“另一个开发人员写了这段代码”的问题 什么是单元测试&#xff1f; 单元测试 什么是单元测试&#xff1f; 单…

【MySQL】内置函数详解

【MySQL】内置函数详解 日期函数字符串函数数学函数加密函数与其它 日期函数 --获取当前日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-07-09 | ---------------- --获取当前时间 mysql> select current_time();…

ChatGLM2-6b本地部署

chatglm2-6m模型 git 地址 https://github.com/THUDM/ChatGLM2-6B 模型百度网盘地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1-LFcPB0H23RSpTKOECsjxw?pwd5e3d 提取码&#xff1a;5e3d 1 模型简介 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#…

【高级程序设计语言C++】类与对象

2.1类的定义2.1.1 类的两种定义方式2.1.2 类的访问限定符2.1.3 C中的struct和class的区别是什么&#xff1f;2.1.4 类的实例化2.1.5 计算类对象的大小2.1.6 this指针 2.2 类的6个默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造函数2.2.4 赋值运算符重载2.2.5 取地址及…

Java新特性:Lambda表达式

Java新特性&#xff1a;Lambda表达式 Lambda 表达式&#xff08;Lambda expression&#xff09;&#xff0c;也可称为闭包&#xff08;Closure&#xff09;&#xff0c;是 Java&#xff08;SE&#xff09;8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口…

第五章——循环和关系表达式

for循环 很多情况下都需要程序执行重复的任务 #include<iostream> using namespace std; int main() {int i;for (i 0; i < 5; i){cout << "C knows loop.\n";}cout << "C knows when to stop.\n";return 0; } for循环的组成部分 …

107、基于51单片机多路无线调频对讲机系统设计(程序+原理图+PCB源文件+参考论文+外文翻译+任务书+开题报告+硬件设计资料+元器件清单等)

摘 要 对讲机作为短距离通信和移动调度指挥的重要工具,在社会各个行业都有广泛的应用。尤其是随着数字电路技术的发展&#xff0c;新型的对讲机无论在外型还是性能上相对传统的模拟对讲机都有了长足的进步。对讲机主要包含需要基站支持的集群对讲机和常规无中心对讲机两种&…

深度理解 JAVA序列化

前言 相信大家日常开发中&#xff0c;经常看到Java对象“implements Serializable”。那么&#xff0c;它到底有什么用呢&#xff1f;本文从以下几个角度来解析序列这一块知识点~ 什么是Java序列化&#xff1f;为什么需要序列化&#xff1f;序列化用途Java序列化常用API序列化…

Android 热修复一

一、什么是热修复&#xff1f; 在我们应用上线后出现bug需要及时修复时&#xff0c;不用再发新的安装包&#xff0c;只需要发布补丁包&#xff0c;在客户无感知下修复掉bug。 实现效果&#xff1a; Demo源码&#xff1a; https://gitee.com/sziitjim/hotfix 二、怎么进行热修…

极速上手k8s,Kubernetes 从入门到摸鱼系列-理论篇

1. 引言&#x1f44b; 大家好&#xff0c;我是比特桃&#xff01;随着微服务架构越来越流行&#xff0c;大规模的微服务容器编排成了一件具有挑战的事情。在这次容器化云原生的发展中&#xff0c;Docker 成了容器化的赢家&#xff0c;而 Kubernetes 则成为了容器编排的赢家。k…

「已解决」 模块““umi“” ““@umijs/max“” 没有导出的成员“useRequest” “request” 问题的所有方法汇总

背景 使用 Umi 搭建项目时候有的时候会出现这种错误&#xff0c;模块““umi”” ““umijs/max”” 没有导出的成员“useRequest” “request”。 解决 tsconfig.json "paths": {"/*": ["src/*"],"/*": ["./src/.umi/*"…

用JShaman本地部署版,加密2.7MB的Webpack生成的JS文件

JShaman是知名的JS代码保护平台。在线使用&#xff0c;一键混淆加密&#xff0c;无需注册、无需登录。可免费用&#xff0c;也有商业服务&#xff1b;有在线使用的SAAS平台网站&#xff0c;也有本地部署版。很方便、很强大&#xff0c;很专业。 今天&#xff0c;测试使用JSham…

unordered_map模拟实现|STL源码剖析系列|开散列

博主很久没有更新过STL源码剖析这个系列的文章了&#xff0c;主要是因为大部分STL常用的容器&#xff0c;博主都已经发过文章了&#xff0c;今天博主带着大家把哈希表也模拟实现一下。 前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blo…

点云最小外包矩形计算

1、原理介绍 一簇点云的最小外包矩形&#xff08;Minimum Bounding Rectangle&#xff0c;MBR&#xff09;&#xff0c;是指用一个矩形将该簇点云框起来&#xff0c;所有点云数据在矩形框内。如下图所示为一个矩形框刚好将点云数据全部包围。 下面给出一种基于最大重叠度的最小…