2024年发布jar到国外maven中央仓库最新教程
文章目录
- 1.国外sonatype仓库的版本
- 1.1老OSSHR账号注册说明
- 1.2新账号注册说明
- 2.新账号注册(必选)
- 3.新账号登录创建Namespace
- 3.1创建Namespace的名字的格式要求(必选)
- 3.2发布一个静态网站(可选)
- 3.3设置dns(可选)
- 3.3 namespace的校验(必选)
- 4.下载安装好gpg 创建和私钥
- 5.idea中maven的setting.xml文件配置
- 6.项目中配置pom
- 7.发布项目
- 7.1 idea中点击deploy发布
- 7.2新账号登录后点击发布
- 7.3搜索发布的依赖
- 8.github使用生成的token拉取项目
- 9.总结
1.国外sonatype仓库的版本
1.1老OSSHR账号注册说明
https://central.sonatype.org/faq/what-happened-to-issues-sonatype-org/
这篇官网链接说了在2024年1月9号,他们宣布将很快停用issues.sonatype.org,并用 Zendesk 电子邮件接收方法替换了 Jira 的审核跟进。
2024.1之前老OSSHR账号注册的老账号使用推送jar到maven仓库还是使用之前的方式即可,网上都有教程的,千篇一律,坑人得很。
老式账号及配置发布参看:
https://blog.csdn.net/SpongeBob_shouse/article/details/128803753
1.2新账号注册说明
https://central.sonatype.org/publish-ea/publish-ea-guide/#why-do-we-have-requirements
网上很多的文章是2024年之前的教程,使用的是OSSRH来注册账号,然后去给官方提issue,去看之前那些坑文教程,就会发现访问OSSRH的官方账号注册链接(上面1.1),点开1.1的这个注册OSSRH的链接找不到提issues的crete的按钮,这个是一个很坑的地方。
2.新账号注册(必选)
https://central.sonatype.com/
https://central.sonatype.org/register/legacy/
手册点sign in会跳到这个注册页面,填写用户名、邮箱(我使用的是qq邮箱账号)、设置下登录密码,然后点击下一步,就登录到首页了
如果是已经注册登录过了,访问下面的地址,点击sign in直接是弹出的是登录页面,数据用户名、登录密码直接登录即可
https://central.sonatype.com/
3.新账号登录创建Namespace
点击pulish到创建Namespace界面,然后点击Add Namespace按钮弹框如下:
3.1创建Namespace的名字的格式要求(必选)
首先得准备一个能访问的、你自己的域名,一般都是将域名反写,如果你没有一个自己的域名,可以使用开源仓库gitHub/gitee的pages发布一个静态的网页,最好是发布一下这个网页能被访问到
https://central.sonatype.org/register/namespace/#managing-your-credentials
格式要求如下:拿github和gitee来举例子:
github的格式:io.github.你的github的账号username
gitee的格式:io.gitee.你的gitee的账号username
如果你的github、gitee的username是大写的,这里默认使用的是小写,也就是它不区分大小写(如果你的账号是大写注册,这里你填写小写即可)
这种通过公共代码托管仓库的方式,必须按照它官方要求的这个namespace的格式来定义和去校验。
3.2发布一个静态网站(可选)
index.html的内容如下:
<html>
<head>我的page-test</head>
<body>this is my project<body>
</html>
然后点击setting找到pages
发布pages
访问https://bigbigfeifei.github.io/
为什么这种搞呢?因为使用gitHub的pages来发布一个页面,然后我们就可以使用io.github.github的username来作为一个groupId如下的项目:
<groupId>io.github.bigbigfeifei</groupId>
这个是github的是这种搞的,gitee的page估计也是跟github差不多的操作,gitee的pages需要实名认证才可以使用,需要上传身份证正反面和手持身份证正反面的照片,这个也比较严格,经过验证这一步是不需要的,因为我亲测了github这种搞了一个静态页面域名可以访问到,然后发布一个项目可以发布到中央仓库上,然后我的gitee的pages提交的实名认证还没有审核过,gitee就没有发布一个bigbigfeifei.gitee.io的域名能访问到的静态页面,访问的时候是404,然后我也去发布了一个groupId如下的项目,然后去账号后台申请配置下setting的token-username和token后,也是可以正常发到中央仓库,所以这一步可以不做,略过即可
<groupId>io.gitee.bigbigfeifei</groupId>
3.3设置dns(可选)
如果你不是用的上面的一些公共仓库代理的域名 + username反写来作为groupid的话你还得设置下dns,这个我没有试过的,只不过官方有这个dns的一个设置说明,因为我的这个是windows电脑,所以在本机设置下dns如下:
https://central.sonatype.org/faq/how-to-set-txt-record/#by-dns
这个里面还有比如阿里云的dns设置啊,就是一些云厂商的dns的设置
本机执行如下:
Windows:
CMD:
nslookup -type=TXT yourdomain.com
Powershell:
Resolve-DnsName yourdomain.com -Type TXT
Linux⚓︎
$ host -t txt yourdomain.com
yourdomain.com descriptive text "OSSRH-XXYYZZ"
or
dig -t txt yourdomain.com
macOS⚓︎
dig -t txt yourdomain.com
3.3 namespace的校验(必选)
https://central.sonatype.org/register/namespace/
根据上面的namespace的格式创建了一个namespace后,是未提交审核的状态,可以提前在根据verification-key在对应的githue或gitee上创建一个公共的仓库,用于namespace提交审核的时候可以证明这个仓库是你自己所有,如果你是先创建namespace之后,没有创建对应verification-key的公共仓库,然后你点击提交审核,你的邮箱里面会收到一条短信如下:
该短信说的是让你在你对应的仓库根据你提交审核的verification-key新建一个公共的代码仓库,来证明这个仓库是你自己的仓库,我采用的是先提交审核后邮箱收到短信,然后我就去我对应的gitee、github上创建了对应verification-key的公开仓库,io.gethub.你的账号的verification-key的要去你的github上根据io.gethub.你的账号的namespace对应的verification-key去创建公开代码仓库,gitee的也是同理,不要搞了叉着了,我这里是创建了两个namespace,一个是github的namespace,一个是gitee的namespace,然后我就给那个老外的邮箱回复了一条短信如下:
根据namespace对应的verification-key去github或gitee代码仓库上创建各自的公开代码仓库如下:
https://github.com/BigBigFeiFei/verification-keyxxxxx
https://gitee.com/BigBigFeiFei/verification-keyxxxxx
回复邮箱消息如下:
意思是:我的两个Namespace的Verification Key以及在github、gitee上创建了公开仓库了,请审核一下,我等您的消息,谢谢。
然后过了差不过了一天,我登录账号去查看着两个namespace已经审核过了,状态截图如下:
到此创建namespace到审核就已经完成了,等审核完成后,之前根据各自的Verification Key创建的公开仓库就可以删除了的。
4.下载安装好gpg 创建和私钥
gpg的下载地址如下:windows下载的是Gpg4win,这个根据你的电脑型号去下面第二个链接查看下载什么对应机子操作系统匹配的gpg即可
https://www.gpg4win.org/download.html
https://central.sonatype.org/publish/requirements/gpg/#answer
gpg的安装位置截图:
我选择的自定义安装,选择的是安装在D盘,所以profile的gpg.executable要这种配置,否则deploy的时候找不到gpg的命令,这里也是需要注意的一个地方
D:\GnuPG\bin\gpg
新建秘钥对:设置名称(默认是windows的账户名称,如果有账号了可以输入之间的即可)和邮箱、密码即可
填写用户名和邮箱,第一次deploy的时候会弹框提示需要输入gpg的账号和密码,然后输入即可,然后会弹框返回一个指纹的key,复制下来,下面配置会用到,如果第二次跟第一次设置的是同一个用户名和邮箱的话,在deploy的时候只要配置setting.xml的profile的pgp的账号密码相同即可,然后deploy的时候就不会弹框提示需要输入gpg的账号和密码。
查看指纹的key,如果你第一次新建密钥对没有复制弹框返回的指纹的key,只需要点击添加的第一条数据回弹框如下会显示指纹的key,复制继续下面的配置
将公钥或key发布到 PGP 密钥服务器:我用的是第二个命令带有这个的hkp://keyserver.ubuntu.com:11371命令,两条命令应该是一样的效果:cmd执行下面的命令即可,然后记住你设置的密码,下面的setting.xml中配置gpg需要用到。
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 公钥ID或上面提到的key
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 你自己的密钥(去重空格)
查询公钥是否发布成功:
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 公钥ID或上面提到的key
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 你自己的密钥(去除空格)
这种就是设置成功的,有输出且没有报错信息,我这个是设置第二次(换了一台电脑,又搞了一遍)都是同一个账号和邮箱,它提示信息没有改变,说明它沿用的还是第一次那个的信息
5.idea中maven的setting.xml文件配置
idea中的setting.xml指定的文件路径中不要包含中文,否则会deplay失败,报错说是setting文件路径中包含中文字符而报错,这里需要注意下,每次修改server的token信息都要记得保存(ctrl + s)
<servers>
<server>
<!--id固定是central 每次deploy前就要去后台申请一个新的token,注意申请了新的token不要去点击比如maven的clean等非deploy的按钮,不然这个token就会被使用了,重复使用就会报错401,所以clean要在配置新的token前就去执行了,配置好新的token后,直接点击项目中maven的deploy发布即可-->
<id>central</id>
<username>token-username</username>
<password>token</password>
</server>
</servers>
<profiles>
<profile>
<id>central</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- gpg的安装位置的 GnuPG\bin\gpg,因为我是安装在D盘在,所以没有设置安装路径,所以子在D盘会有两个文件夹GnuPG和\Gpg4win,如果指定了安装路径的话,一个是在一个文件夹下有GnuPG和\Gpg4win,然后配置应该是这种的 安装位置 x盘:\xxxx+\GnuPG\bin\gpg -->
<gpg.executable>D:\GnuPG\bin\gpg</gpg.executable>
<gpg.passphrase>你的gpg的密码</gpg.passphrase>
</properties>
</profile>
</profiles>
登录新账户创建token-username和token
点击创建token,将创建的username和password配置到上面setting.xml的server标签中
官方是建议使用这种方式的,不建议直接配置新账号的用户名和密码,并且使用token-username和token的这种方式,每次上传就要去后台生成一个然后将idea配置的seting.xml中的server的server的username、password重新使用新生成的,也就是说每次deploy都要去后台新生成一个token-username和token,生成的token-username和token只能使用一次,这个也是为了安全考虑,我试过配置setting.xml中server标签中新用户的账号(明文)和密码(明文)然后去发布也还是401的,不支持,老账号那种倒是支持的,并且密码中不能设置特殊字符,官网有说明的,但是现在这种使用token的方式就不用管密码中是否有特殊字符了,申请一次用一次。
https://central.sonatype.org/publish/generate-token/
6.项目中配置pom
官方maven的pom配置规范:
https://central.sonatype.org/publish/requirements/#provide-files-checksums
下面的可以直接copy过去使用的:
<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>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<serverId>central</serverId><!-- 服务id 也就是setting.xml中的servers.server.id -->
</properties>
<build>
<plugins>
<!-- 编译插件,设置源码以及编译的jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</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.9.1</version>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc -->
<!-- Gpg Signature -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 老账号的配置:Gpg Signature -->
<!--将组件部署到OSSRH并将其发布到Central Repository-->
<!--<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<extensions>true</extensions>
<configuration>
<serverId>${serverId}</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>-->
<!--新账号的配置:将组件部署到OSSRH并将其发布到Central Repository-->
<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>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>
<snapshotRepository>
<!-- 与settings.xml的server.id保持一致 -->
<id>${serverId}</id>
<url>https://central.sonatype.com/</url>
</snapshotRepository>
<!-- 老账号配置
<snapshotRepository>
<!–这个id和settings.xml中servers.server.id要相同,因为上传jar需要登录才有权限–>
<id>${serverId}</id>
<name>OSS Snapshots Repository</name>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<!–这个id和settings.xml中servers.server.id要相同,因为上传jar需要登录才有权限–>
<id>${serverId}</id>
<name>OSS Staging Repository</name>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>-->
</distributionManagement>
需要修改的配置:
坐标id:
<groupId>io.github.账号username</groupId>
或者:
<groupId>io.gitee.账号username</groupId>
下面是一个demo示例:需要注意的是version必须不带SNAPSHOT的,因为新版不支持发布SNAPSHOT,descriptio描述必须要有,这里也是要注意一下的,如果version设置的有问题或者description没有的话deploy的时候会报错提示的
<groupId>io.github.bigbigfeifei</groupId>
<artifactId>es-spring-boot-start</artifactId>
<!-- 发布到这个上OSSRH:项目中的version,不要带上SNAPSHOT,这样就可以直接发布到中央仓库
如果带上了,会发布到私服的snapshots下面,可以搜索进行查看,
但是发布到Maven Central的新版本是不支持SNAPSHOT会被校验这个的,如果带来SNAPSHOT则推送失败,所以需要去掉version这个SNAPSHOT。 -->
<version>1.0</version>
<!--描述一定要有-->
<description>es启动器</description>
下面是需要修改成你自己的项目地址即可:url、scm、developers修改成自己的即可,licenses不用修改直接使用
<!--项目访问url -->
<url>https://github.com/BigBigFeiFei/es-spring-boot-start</url>
<scm>
<!--项目访问url -->
<url>https://github.com/BigBigFeiFei/es-spring-boot-start</url>
<!--项目访问url.git结尾 -->
<connection>scm:git:https://github.com/BigBigFeiFei/es-spring-boot-start.git</connection>
<!--项目访问url.git结尾 -->
<developerConnection>scm:git:https://github.com/BigBigFeiFei/es-spring-boot-start.git</developerConnection>
</scm>
<developers>
<developer>
<id>BigFei</id>
<name>BigFei</name>
<email>xxxx@qq.com</email>
<!--项目访问url -->
<url>https://github.com/BigBigFeiFei/es-spring-boot-start</url>
<timezone>+8</timezone>
</developer>
</developers>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
7.发布项目
7.1 idea中点击deploy发布
做好了以上的配置准备后,我们就可以来发布项目到中央仓库了。
在idea的项目中点击deploy,运行没有报错,能看到BUILD SUCCESS,说明是上传成功,要注意的是idea配置的maven的setting.xml中server的token-username、token每次点击deploy前都要去后台重新生成一个,然后配置到maven的setting.xml中的sever里面,每deploy前都要去搞一对新的token秘钥对来进行配置,一对只能使用一次,重复使用deploy会报401
或者是使用命令:
mvn clean deploy -e
//-e参数可以打印出deploy的相关错误信息,以便排查问题
mvn命令参考:
https://www.cnblogs.com/tobyhomels/p/15890023.html
https://blog.csdn.net/zdwzzu2006/article/details/130788625
还有如果你按照老的那个账号的配置pom中的仓库地址是
老式账号pom中配置了plugin和仓库地址如下,deploy的时候会报401,没有权限,身份认证失败
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<extensions>true</extensions>
<configuration>
<!--与settings.xml的server.id保持一致 -->
<serverId>${serverId}</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<distributionManagement>
<snapshotRepository>
<!--这个id和settings.xml中servers.server.id要相同,因为上传jar需要登录才有权限 -->
<id>${serverId}</id>
<name>OSS Snapshots Repository</name>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<!--这个id和settings.xml中servers.server.id要相同,因为上传jar需要登录才有权限 -->
<id>${serverId}</id>
<name>OSS Staging Repository</name>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
当你用新账号注册的账号和密码去登录:
https://s01.oss.sonatype.org/
你会发现登录不上去,因为这个地址是之前的老的那种方式,官方都要不用这种方式了,所以这种搞就是牛头不对马嘴,让人感到蛋疼,这里也是之前那些旧文章坑文章里面这种搞的,这里是一个大坑。
新账号的方式需要用如下的插件:
https://central.sonatype.org/publish/publish-portal-maven/#namespace-details-and-actions
<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>
</configuration>
</plugin>
7.2新账号登录后点击发布
登录注册地址:
https://central.sonatype.com/
发布了之后就删除不了了,看看能把namespace删除之后重新,创建namespace审核通过后去提交一个,这个没有必要去删除namespace,发布了之后删除不了就不要管它的,你修改版本号重新推送去发布即可,根据版本号来发布就是最新的包了,如果已经上传过了,再去执行deploy的话会报错,后台管理会有一条上传的消息说,你这个包已经上传过了,然后你可以把那个上传失败记录删除了。
7.3搜索发布的依赖
搜索你建立的namespace下的组件名称就可以搜到了
8.github使用生成的token拉取项目
在账号的setting中点击
然后点击Developer settings:
创建token:两种方式随便选一种,
token的过期时间设置长一点,设置几千天(相当于永不过期),不然每次都要去搞一个token,然后给权限,权限设置如下:
然后拉取代码之后需要进入到项目路径下(比如我git clone 下来一个项目叫xxx,那就进入到xxx目录,然后cmd执行如下命令)设置一下这个token(下面的token设置为自己的)
git remote set-url origin https://你的token@github.com/BigBigFeiFei/项目.git
这种设置之后,在idea修改代码后就不用输入用户名和密码或token,即使是idea提交弹框输入用户名和token也会校验失败,所以的先这种设置一下,然后直接提交代码就可以提交上去了,不会弹框提示需要验证啥的,这个不知道为啥不支持输入用户名、密码/token记住了,这个是我试了不可以,也不知道为啥,估计是没有找到正确的姿势。
弹框登录使用账号密码登录会跳转到idea的账号页面,然后去登录github的账号(那首先你就得有一个idea的账户,可以去idea申请注册一个,然后你的idea上登录这个账号,就可以把你idea的一些基本的配置同步到远端的账号上,后面你换电脑了之后,安装新的idea只有重新登录同步远端的账号的配置(setting sync 开启同步)即可,方便快捷的),这种方式可以去试下。
idea的maven点击deploy控制台有中文乱码解决:设置maven的运行时的虚拟机参数文件编码为GBK即可
-Dfile.encoding=GBK
9.总结
由于我之前不是写了几个好用的start,然后我就想着能不能发布到国外的中央仓库上,给大家提供一个依赖,引入即可,然后我就去网上看了一些教程,结果实践下来发下,全部是过时的教程了,全网都没有一篇可行的教程么?然后我就通过看之前那些旧的教程博客和官方的文档,去做了各种的尝试,上传这个尝试也是花了我点时间,摸索了几天还是搞出来了的,去看官方的英文文档,也是有点蛋疼,英文不咋个好就只能用翻译软件翻译着看,或者边看边猜它的大概意思,最终还是发布上去了,特殊说明在访问github或国外的一些网站需要科学上网一下,不然有的是访问不到的,这个需要你去处理解决下这个网络不通的问题,后面我会把我之前写的那几个好用的start开源出来,然后提供出中央仓库的坐标,方便大家直接引入使用,通过本文你可以把自己的轮子发布到中央仓库给大家使用,so easy,敬请期待,希望我的分享对你有所启发和帮助,请一键三连,么么么哒!