Java如何将jar包上传到Maven中央仓库(超详细2023最新版)

Java如何将jar包上传到Maven中央仓库

引言

由于最近我迷上了一个开源项目 JustAuth, 这个开源项目整合许多第三方登录,比如常见的:QQ、Gitee、Github、微信、微博、支付宝等等,号称”一款小而全的第三方登录的开源组件“,出于好奇,我拉去了他在Github上的源码,然后跑了一下他提供的Demo,发现真的相当不错,其中项目应用了许多设计模式,比如:适配器模式(统一接口)、建造者模式(便捷构建对象)、模板方法模式(提高代码复用性),还有其它一些开发技巧,比如:通过注入降低类与类的耦合性、开发规范、通用HTTP客户端的封装、枚举类的常见使用技巧,这些东西都很值得学习,我大概花了一个下午的时间,摸透了这个项目,项目总的来讲还算简单,感兴趣的可以自己拉一下源码研究一下,我也是受到这个项目的启发,于是自己也开发了一个微型版的 SDK ,当然我的 SDK 目前只集成了QQ、微博、Gitee、Github,原项目集成了大概有30个平台,国内国外知名平台都有,还配置有代理,真的是一个很不错的项目,特别是对于我这种小白而言😄可以说是一个入门级别的开源项目,打算以后有时间多研究一下这些知名的开源项目,感觉直接看开源项目比看那些视频要好多的。在开发完 SDK 之后,我就想把自己写的项目像 JustAuth 一样,发布到Maven中央仓库,所以就有了这篇文章,然后自己要用,就直接引入对应的 jar 包就可以了

Step1:注册 JIRA 账号

  • Step1:注册 JIRA 账号

    JIRA 是一个缺陷跟踪管理系统,为针对缺陷管理、任务追踪和项目管理的商业性应用软件,开发者是澳大利亚的Atlassian。JIRA这个名字并不是一个缩写,而是截取自“Gojira”,日文的哥斯拉发音。

    注册地址:https://issues.sonatype.org/secure/Signup!default.jspa

    image-20230815222041232

    注册的时候要记住账号和密码,Step4需要用到

Step2:发布申请

  • Step2:发布申请

    1)创建项目

    image-20230816191110882

    2)填写项目信息

    image-20230816190355096

    大概等个一两小时就有人在你的项目下面评论了

    image-20230816191447371

    按照它的步骤完成就可以进行下一步了,其实也不用等,可以直接进行下一步(●’◡’●)

    一般而言,如果你使用Gitee或Github作为项目的 group id,那么他会要求你新建一个公开的仓库,让后将当前项目置于开放状态,过一段时间(大概两小时左右),管理员就会留言,告诉你申请通过了,此时我们就可以来到 Step6

Step3:下载并安装GPG

  • Step3:下载并安装GPG

    GNU Privacy Guard是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 是自由软件,遵循 IETF 订定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。 GnuPG 是自由软件基金会的 GNU 计划的一部分,曾受德国政府资助

    1)下载GPG

    下载连接:https://gnupg.org/download/index.html

    image-20230815222545266

    2)解压并安装

    这一步过于很简单,解压后点击安装无脑下一步(需要注意切换安装目录,默认是安装在C盘)

    安装成功后,我们进入 CMD 窗口,输入 gpg --version后检测是否安装成功,如果出现下面页面就说明安装成功了

    image-20230815222819828

    3)生成密钥

    同样的在 CMD 窗口中输入 gpg --gen-key 指令,然后 输入 用户名 和 账号

    image-20230815231833468

    然后输入下面的指令,就可以获取对应的私钥

    gpg --keyserver hkp://keyserver.ubuntu.com --send-keys 你的公钥
    

    备注:

    1. 忘记了公钥,也可以通过gpg --list-keys查看当前所有的公钥

Step4:配置maven的setting.xml

  • Step4:配置maven的setting.xml

    1)查看你Maven的配置文件所在位置

    img

    2)打开配置文件,添加如下配置

        <servers>
        	<server>
          		<id>ossrh</id>
          		<username>JIRA账号</username>
          		<password>JIRA密码</password>
        	</server>
      	</servers>
    

    注意:id中的值可以任意改,但是后面 pom.xml 中的对应的地方也要改动

Step5:配置pom.xml

  • Step5:配置pom.xml

    打开你要打包的项目,编写如下配置,这里我就直接给出了完整的配置,你只需要自行改动成属于你项目的元素就可以了,不懂的可以评论留言,随时在线解答

    <?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>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.7.12</version>
            <relativePath/>
        </parent>
    
        <groupId>io.gitee.aghp</groupId>
        <artifactId>api-feign-sdk</artifactId>
        <version>0.0.1</version>
        <name>api-feign-sdk</name>
        <packaging>jar</packaging>
        <url>https://gitee.com/aghp/api-feign-sdk</url>
        <description>一个对请求进行签名的HTTP客户端</description>
    
        <licenses>
            <license>
                <name>Apache License | Version 2.0</name>
                <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
                <distribution>repo</distribution>
                <comments>A business-friendly OSS license</comments>
            </license>
        </licenses>
    
        <scm>
            <url>https://gitee.com/aghp/api-feign-sdk</url>
            <connection>https://gitee.com/aghp/api-feign-sdk.git</connection>
        </scm>
    
        <developers>
            <developer>
                <name>aghp</name>
                <id>aghp</id>
                <email>3254213612@qq.com</email>
                <roles>
                    <role>Developer</role>
                </roles>
                <timezone>+8</timezone>
            </developer>
        </developers>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    
            <maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
            <maven-gpg-plugin.version>1.5</maven-gpg-plugin.version>
            <maven-source-plugin.version>2.2.1</maven-source-plugin.version>
            <nexus-staging-maven-plugin.version>1.6.7</nexus-staging-maven-plugin.version>
    
            <java.version>1.8</java.version>
            <spring-boot.version>2.7.12</spring-boot.version>
    
            <server.id.value>ossrh</server.id.value>
        </properties>
    
        
        <dependencies>
            <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <!--注解处理器-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
            <!--Lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <!--测试环境-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!--Hutool-->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.8.16</version>
            </dependency>
        </dependencies>
    
        
        <profiles>
            <profile>
                <id>default</id>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                
                <!--管理仓库信息-->
                <distributionManagement>
                    <snapshotRepository>
                        <id>${server.id.value}</id>
                        <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
                    </snapshotRepository>
                    <repository>
                        <id>${server.id.value}</id>
                        <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                    </repository>
                </distributionManagement>
                
                <build>
                    <plugins>
                        <!--用于与 Sonatype Nexus 仓库进行集成,方便在 Maven 构建过程中进行部署和发布操作-->
                        <plugin>
                            <groupId>org.sonatype.plugins</groupId>
                            <artifactId>nexus-staging-maven-plugin</artifactId>
                            <version>${nexus-staging-maven-plugin.version}</version>
                            <extensions>true</extensions>
                            <configuration>
                                <serverId>${server.id.value}</serverId>
                                <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                                <autoReleaseAfterClose>true</autoReleaseAfterClose>
                            </configuration>
                        </plugin>
                        <!--Maven编译插件-->
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-source-plugin</artifactId>
                            <version>${maven-source-plugin.version}</version>
                            <executions>
                                <execution>
                                    <id>attach-sources</id>
                                    <goals>
                                        <goal>jar-no-fork</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                        <!--Javadoc插件,用于生成Javadoc文档-->
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-javadoc-plugin</artifactId>
                            <version>${maven-javadoc-plugin.version}</version>
                            <configuration>
                                <!-- jdk1.8要加上,1.7要去掉,否则会报错 -->
                                <additionalJOptions>
                                    <additionalJOption>-Xdoclint:none</additionalJOption>
                                </additionalJOptions>
                            </configuration>
                            <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>${maven-gpg-plugin.version}</version>
                            <executions>
                                <execution>
                                    <id>sign-artifacts</id>
                                    <phase>verify</phase>
                                    <goals>
                                        <goal>sign</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
                
            </profile>
        </profiles>
    </project>
    

Step6:上传 jar 包

  • Step6:上传 jar 包

    执行下面的指令:

    mvn clean deploy
    

    image-20230816200510909

  • Step7:发布 jar 包

    1)登录:https://s01.oss.sonatype.org/#stagingRepositories

    image-20230816195516135

    2)选中它,然后点击 closed(如果你开启了自动关闭,就可能没有这个选项,你不用慌)

    image-20230816195606861

    3)检测完成后上方的release就会变成可点击的状态,点击release后,你会收到一份邮件

    image-20230816200737694

    4)点击 release 按钮之后,留意邮箱,会受到一封短信

    image-20230816201502646

    看到这封信,我们就可以大功告成了,过段时间我们就可以引入我们上传的 jar 包了,整体来说并不是很难

Step7:引入 jar 包

  • Step7:引入 jar 包

    大概两小时之后,就可以在:https://central.sonatype.com/?smo=true 中搜索我们刚刚上传的 jar 包

    image-20230816203510608

    
    

Bug记录

相信这一步份是大家最期待的吧,其实在发布jar包的过程中我只遇到过一个Bug,这得感谢互联网上哪些大佬分享的 blog,他们的博客都讲解 的十分详细,我其中参考了三篇文章,多看几篇防止出现特殊现象。

  • bug1:执行mvn clean deploy一直报错401

    image-20230816194044178

    问题排查:说实话,这个bug真的很折磨人,我排查了好久,问GPT、百度,都是说权限问题,是GPG签名错误,JIRA账号密码错误,或者 id的value值没有与 pom.xml文件对应,结果我一个一个尝试,基本上都尝试了一遍,最终还是没有发现,我还以为是依赖的问题,当时真的是很无奈。最后我突然想到了一种可能,那就是是不是我的 JIRA 账号的问题, 我的 JIRA 账号是中文,我当时在注册 JIRA账号的时候,在想“我是中国人,就应该用中文注册”,结果发现天真了。

    我没得办法,网上所有的方式我都尝试了,自己也想了很多种可能,最终还是怀疑到是JIRA账号的原因,我的账号是中文名,然后pom.xml文件使用的编码格式是UTF-8,中文在UTF-8和其它编码格式上是不一样的,由于 JIRA账号一旦创建,账号名是不能修改的,于是我重新注册了一个新账号,把之前的账号项目给注销掉,这次账号名改为英文,重新执行mvn clean deploy,一下就成功了┭┮﹏┭┮,下次最好不要使用中文啊,血淋淋的教训,这个学编程英语国家真的好友优势,唉谁叫这东西是他们发明出来的呢,期待有一天计算机对于中文没有歧视

    问题原因:中文编码出现乱码

    问题解决:新建一个 JIRA 账号,账号名使用英文

  • bug2:第二次执行mvn clean deploy报错

    问题原因:这个错误很明显,由于项目中修改了一些代码,然后没有修改版本号,直接deploy代码到仓库,最终导致错误!

    问题解决:修改一下版本号,比如之前的版本号是 0.0.1,修改了代码之后我们在执行 mvn clean deploy 之前先将版本号修改为

    0.0.2 就OK了

参考文章

在此致谢各位💖

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识汲取者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值