参考以下链接:
手把手教你提交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帐号的域名。
验证域名
域名解析验证
如果是自己的域名,则需要在域名解析中增加 TXT的解析与项目主页,如下所示:
将对域名的请求转发到项目的主页链接上(就是前面在issue工单上填写的项目地址)。
验证域名解析是否成功
$ 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” 按钮通知一下工作人员验证域名。
等待域名验证回复了,回复结果如下,则表示可以推送你的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
如上图所示:红色边框选中的就是公钥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”
修改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包是否成功上传。