2023攻略:在Maven中央仓库发布jar包

参考以下链接:

手把手教你提交Jar包到Maven公共仓库-腾讯云开发者社区-腾讯云

https://www.cnblogs.com/zimug/p/16575819.html

将github项目上传到Maven中央仓库操作小记_githun 上传到的maven-CSDN博客

关于把自己的Jar包开源到Maven仓库的问题-腾讯云开发者社区-腾讯云

最新-发布java工具包到 maven 中央仓库,不踩坑_maven-gpg-plugin-CSDN博客

手把手教你提交Jar包到Maven公共仓库-阿里云开发者社区

准备域名

因为maven仓库要求上传jar包,必须要有groupid,这个必须你自己真实用的一个域名,所以要先准备域名。方案如下:

  • 可以用你自己的域名;

    如果有的话可以重复使用;

  • 购买新的域名;

    购买流程:注册登录 https://www.gname.com/user ,挑选域名,支付宝付款,新建过户模版,将域名使用过户模版;

  • 用github的域名;

    用github域名:注册一个github用户,io.github.XXX 就是后面用到的 groupid

注册账号

访问地址:What Happened To issues.sonatype.org? - The Central Repository Documentation,注册 sonatype 账号,之后一定要用帐号与密码登录sonatype仓库(Nexus Repository Manager)来验证一下新帐号能登录仓库(有时候会因为系统原因导致新帐号不能登录sonatype仓库),如果不能登录则不能继续向下执行,需要重新注册一个新sonatype帐号。

注册页面填一下邮箱、姓名、用户名和密码后,点击sign up就完成了。

在这里插入图片描述

提交issue

登录完成后,语言可以选择中文,在system dashboard页面中,点击上方导航栏上的新建按钮,就可以创建一个 issue(工单)。

填写页面如下图所示:

在这里插入图片描述

填写完后,点击新建即可(上图由于是已经提交了的,所以是更新按钮)。

等待回复

等待几分钟后,就会收到 OSSRH 的回复,如下图所示:

在这里插入图片描述

主要问题是 groupId 必须是你自己真实有效控制的一个域名或你自己的Github帐号的域名。

验证域名

域名解析验证

参考官方:How do I set the TXT record needed to prove ownership of my Web Domain? - The Central Repository Documentation

如果是自己的域名,则需要在域名解析中增加 TXT的解析与项目主页,如下所示:

image-20230913103027854

image-20230913103124729

将对域名的请求转发到项目的主页链接上(就是前面在issue工单上填写的项目地址)。

image-20230913103221233

验证域名解析是否成功

$ nslookup -type=TXT ossrh-94937.etl.icu
​
Server:172.20.10.1
Address:172.20.10.1#53
​
Non-authoritative answer:
ossrh-95002.etl.icutext = "https://issues.sonatype.org/browse/OSSRH-94937"

验证GitHub帐号

如果 groupid 是 io.github.mose-x 这种git域名,则需要新建一个公开的git仓库,如下两个图(网上找的)

在这里插入图片描述

在这里插入图片描述

等待验证

域名验证操作完毕后,要到 sonatype 的工单页面点击 “waiting for Response” 按钮通知一下工作人员验证域名。

截屏2023-09-13 10.38.00

等待域名验证回复了,回复结果如下,则表示可以推送你的java工具了

在这里插入图片描述

GPG签名

接下来要用 gpg 生成秘钥,在后续包发布 jar 时会根据生成的秘钥进行校验,因为sonatype也需要对上传这一行为进行权健的校验,避免无意义或恶意上传文件的行为。

安装GPG

官网下载地址:https://www.gnupg.org/download/

window下安装:https://files.gpg4win.org/gpg4win-4.0.4.exe

MacOS下安装运行命令:brew info gpg

创建秘钥

# 查看版本来检查
$ gpg --version
​
# 生成密钥对
$ gpg --gen-key
​
# 查看生成的公钥
$ gpg --list-keys
​
# 将公钥发布到GPG密钥服务器
$ gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 公钥ID
​
# 查询是否已将公钥发布到服务器
$ gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 公钥ID
​
# 删除密钥:先删私钥,再删除公钥
$ gpg --delete-secret-keys [uid]
$ gpg --delete-keys [uid]
​
# 导出公钥
$ gpg -a -o public-file.key --export [uid]
# 导出私钥
$ gpg -a -o private-file.key --export-secret-keys [uid]
# 导入公钥或私钥
$ gpg --import xxxx.key

在安装完成后,在命令行执行下面命令来生成一个秘钥:

$ gpg --gen-key

在生成的过程中,首先会要求输入姓名和邮箱地址,在命令行窗口下填完这两个信息后,还会弹窗要求输入一个密码:

在这里插入图片描述

这个密码非常重要,一定要记住,后面在项目deploy的时候还会用到。填完后继续,秘钥就会成功生成并保存在本地目录下了:

在这里插入图片描述

可以使用如下命令查看生成的密钥:

$ gpg --list-keys

image-20230913095520535

如上图所示:红色边框选中的就是公钥ID

上传秘钥

在秘钥生成完后,我们需要把公钥上传到公共服务器供sonatype验证,可以通过下面的命令将公钥上传:

$ gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 公钥ID

上传密钥有很大可能会出现失败情况,可以尝试上传到其他的存放公钥的服务器:

  • keyserver.ubuntu.com

  • pool.sks-keyservers.net

  • keys.openpgp.org

  • pgp.mit.edu

  • keys.gnupg.net

  • keyserver.ubuntu.com

端口都是11371,这些公钥服务器间会同步它们的数据给其他服务器,所以只要上传成功到其中一台就行。

如下所示是处理上传失败的方案:

gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 8D37F9F1AAB6ADE11D0CD04CE9A3D90D4B60CBF9
gpg: 正在发送密钥 8D37F9F1AAB6ADE11D0CD04CE9A3D90D4B60CBF9 到 hkp://keyserver.ubuntu.com
gpg: 发送至公钥服务器失败:No route to host
gpg: 发送至公钥服务器失败:No route to host
​
# 先使用命令 ping keyserver.ubuntu.com 得到域名对应的IP地址:185.125.188.27
gpg --keyserver hkp://185.125.188.27:11371 --send-keys 8D37F9F1AAB6ADE11D0CD04CE9A3D90D4B60CBF9
​
# 验证密钥是否已成功上传
gpg --keyserver hkp://185.125.188.27:11371 --recv-keys 8D37F9F1AAB6ADE11D0CD04CE9A3D90D4B60CBF9

Maven

安装 apache-maven-3.3.1,下载地址: Central Repository: org/apache/maven/apache-maven/3.3.1

配置setting.xml

在你本地的仓库目录(如:/Users/xxx/.m2/settings.xml)下新建setting.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
​
   <!-- apache-maven-3.3.1 下载地址: https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.3.1/ -->
   <pluginGroups></pluginGroups>
​
   <proxies></proxies>
​
   <servers>
       <server>
           <id>ossrh</id>
           <username>xxx</username> <!-- sonatype帐号 -->
           <password>xxx</password> <!-- sonatype帐号密码 -->
       </server>
   </servers>
​
   <mirrors></mirrors>
​
   <profiles>
       <profile>
           <id>ossrh</id>
           <properties>
               <gpg.executable>gpg</gpg.executable>
               <gpg.passphrase>xxx</gpg.passphrase> <!-- GPG签名的密码 -->
           </properties>
       </profile>
   </profiles>
​
   <!-- 激活 ossrh <profile> -->
   <activeProfiles>
       <activeProfile>ossrh</activeProfile>
   </activeProfiles>
​
</settings>

配置Maven环境

在Idea的设置中搜索 “Maven”,按下图所示的配置 “Maven home path” 与 “User settings file”

image-20230914180622682

修改pom.xml

pom.xml中需要添加各种插件,除了常用的maven-compiler和maven-deploy插件外,还需要下面几个关键插件:

● nexus-staging-maven-plugin:sonatype插件,用来将项目发布到中央仓库使用

● maven-source-plugin:生成java-source.jar文件

● maven-javadoc-plugin:生成java doc文档

● maven-gpg-plugin:对文件进行自动签名

下面是我的工程pom.xml文件,直接拷到你的项目中修改下项目信息就可以使用:

<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>icu.etl</groupId>
   <artifactId>easyetl</artifactId>
   <version>1.0.2</version>
   <packaging>jar</packaging>
   <name>easyetl</name>
   <url>https://github.com/jeremy8551/easyetl</url>
   <description>A simple and easy-to-use ETL tool</description>
​
   <!-- 插件属性 -->
   <properties>
       <project.build.sourceEncoding>GBK</project.build.sourceEncoding>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <maven.compiler.charset>GBK</maven.compiler.charset>
       <maven.test.skip>true</maven.test.skip>
       <maven.javadoc.failOnError>false</maven.javadoc.failOnError>
       <maven.javadoc.skip>false</maven.javadoc.skip>
   </properties>
​
   <!-- Apache Licene 2.0 开源软件许可证 -->
   <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>
       </license>
   </licenses>
​
   <!-- Source Code Management,源代码版本管理信息 -->
   <scm>
       <!-- connection 用于一般用户访问代码仓库的URL,通常用于只读访问 -->
       <connection>scm:git:https://github.com/jeremy8551/easyetl.git</connection>
       <!-- developerConnection:用于开发者访问代码仓库的URL,可以读写 -->
       <developerConnection>scm:git:https://github.com/jeremy8551/easyetl.git</developerConnection>
       <!-- url:项目的Web页面或信息页面的URL -->
       <url>https://github.com/jeremy8551/easyetl</url>
   </scm>
​
   <!-- issue -->
   <issueManagement>
       <system>Github Issue</system>
       <url>https://github.com/jeremy8551/easyetl/issues</url>
   </issueManagement>
​
   <!-- 开发人员 -->
   <developers>
       <developer>
           <name>jeremy8551</name>
           <email>jeremy8551@qq.com</email>
           <timezone>+8</timezone>
           <roles>
               <role>Developer</role>
           </roles>
       </developer>
   </developers>
​
   <dependencies>
       <!-- 测试工具包 -->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
           <scope>test</scope>
           <optional>true</optional>
       </dependency>
​
       <!-- servlet 规范 -->
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.1.0</version>
           <scope>provided</scope>
           <optional>true</optional>
       </dependency>
​
       <!-- db2 数据库驱动 -->
       <dependency>
           <groupId>com.ibm.db2.jcc</groupId>
           <artifactId>db2jcc</artifactId>
           <version>db2jcc4</version>
           <scope>test</scope>
           <optional>true</optional>
       </dependency>
​
       <!-- slf4j日志门面 -->
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>2.0.9</version>
           <optional>true</optional>
       </dependency>
​
       <!-- logback日志 -->
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.3.6</version>
           <optional>true</optional>
       </dependency>
   </dependencies>
​
   <build>
       <finalName>easyetl</finalName>
       <plugins>
           <!-- 单元测试插件 -->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>2.12.4</version>
               <configuration>
                   <skip>${maven.test.skip}</skip>
               </configuration>
           </plugin>
​
           <!-- 编译插件 -->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.8.1</version>
               <configuration>
                   <source>${maven.compiler.source}</source>
                   <target>${maven.compiler.target}</target>
               </configuration>
           </plugin>
​
           <!-- 生成 Javadoc 的jar文件 -->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>3.5.0</version>
               <executions>
                   <execution>
                       <phase>package</phase>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
               <configuration>
                   <!-- 配置不需要校验的包名,用半角逗号分隔 -->
                   <!-- https://maven.apache.org/plugins/maven-javadoc-plugin/examples/exclude-package-names.html -->
                   <excludePackageNames>icu.jsch.*,icu.apache.*</excludePackageNames>
                   <tags>
                       <tag>
                           <!-- https://maven.apache.org/plugins/maven-javadoc-plugin/examples/tag-configuration.html -->
                           <name>createtime</name> <!-- 自定义 @createtime 标记,屏蔽生成javadoc时的错误信息 -->
                           <placement>a</placement> <!-- 指定标签的放置位置,a表示能在所有位置使用 -->
                           <head>创建时间:</head> <!-- 定义标签的前缀,例如 "作者:" 或 "版本:" -->
                       </tag>
                   </tags>
                   <!--                   <show>private</show>-->
                   <!--                   <nohelp>true</nohelp>-->
                   <!--                   <charset>UTF-8</charset>-->
                   <!--                   <encoding>UTF-8</encoding>-->
                   <!--                   <docencoding>UTF-8</docencoding>-->
                   <!--                   <additionalparam>-Xdoclint:none</additionalparam>-->
               </configuration>
           </plugin>
       </plugins>
   </build>
​
   <profiles>
       <!-- 将deploy配置作为一个profile,在执行deploy命令时激活这个profile: clean deploy -P release -->
       <profile>
           <id>release</id>
           <build>
               <plugins>
                   <!-- 插件用于生成源码jar文件 -->
                   <plugin>
                       <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-source-plugin</artifactId>
                       <version>3.2.1</version>
                       <executions>
                           <execution>
                               <phase>package</phase>
                               <goals>
                                   <goal>jar-no-fork</goal>
                               </goals>
                           </execution>
                       </executions>
                   </plugin>
​
                   <!-- 插件用于生成Javadoc的jar文件 -->
                   <plugin>
                       <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-javadoc-plugin</artifactId>
                       <version>3.4.1</version>
                       <executions>
                           <execution>
                               <phase>package</phase>
                               <goals>
                                   <goal>jar</goal>
                               </goals>
                               <configuration>
                                   <doclint>none</doclint> <!-- 禁用DocLint检查,屏蔽警告和报错信息 -->
                               </configuration>
                           </execution>
                       </executions>
                   </plugin>
​
                   <!-- GPG签名插件,对项目最后生成的jar包进行签名 -->
                   <plugin>
                       <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-gpg-plugin</artifactId>
                       <version>3.0.1</version>
                       <executions>
                           <execution>
                               <phase>verify</phase> <!-- 验证阶段 -->
                               <goals>
                                   <goal>sign</goal> <!-- 插件目标: 在验证阶段执行 GPG 签名操作 -->
                               </goals>
                           </execution>
                       </executions>
                   </plugin>
​
                   <!-- sonatype插件,用于登录验证、上传jar到sonatype的maven仓库 -->
                   <plugin>
                       <groupId>org.sonatype.plugins</groupId>
                       <artifactId>nexus-staging-maven-plugin</artifactId>
                       <version>1.6.7</version>
                       <extensions>true</extensions>
                       <configuration>
                           <serverId>ossrh</serverId>
                           <!-- 这里的 https://s01.oss.sonatype.org/ 是生成 sonatype 的issues工单时, 机器人评论的那个地址-->
                           <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                           <autoReleaseAfterClose>true</autoReleaseAfterClose>
                       </configuration>
                   </plugin>
               </plugins>
           </build>
​
           <!-- 项目jar包分发管理信息 -->
           <distributionManagement>
               <snapshotRepository>
                   <!-- 快照版本 -->
                   <id>ossrh</id>
                   <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
                   <!-- 这里的 https://s01.oss.sonatype.org/ 是生成 sonatype 的issues工单时, 机器人评论的那个地址-->
               </snapshotRepository>
               <repository>
                   <!-- 发布正式版 -->
                   <id>ossrh</id>
                   <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
               </repository>
           </distributionManagement>
       </profile>
   </profiles>
​
</project>

在修改完成后,运行下面命令,查看配置是否已经生效了:

$ mvn help:effective-settings

deploy与验证

clean deploy -P release

出现如下,即成功

在这里插入图片描述

并且在OSSRH中也能收到反馈

在这里插入图片描述

立即可以登录到sonatype的仓库验证:https://s01.oss.sonatype.org

等待一段时间后可以到中央仓库 Central Repository: 查询jar包是否成功上传。

等待一段时间后到Maven中央仓库的搜索引擎 Maven Central Repository Search 查询jar包是否成功上传。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值