最近利用工作闲暇之余,开发了一个基于logback底层的日志脱敏工具jar 包(欢迎大家吐槽:logback日志脱敏工具),同事推荐上传到maven中央仓库,方便大家使用。于是萌生了上传jar 包到maven中央仓库的想法,在此分享一下将jar包发布到Maven中央仓库的过程以及常见错误的解决办法。
一、创建jira工单
1.1、注册Sonatype帐号:
在网站https://issues.sonatype.org/secure/Signup!default.jspa注册一个账号(请记住账号和密码,后续需要用到)[已经注册过帐号的跳过此步骤]
1.2、创建提交jar 包申请工单:
登录后选择Create Issue, 选择Community Support - Open Source Project Repository Hosting (OSSRH)以及New Project, 其他按照自己的项目情况填写。
必填项
Project:Community Support - Open Source Project Repository Hosting
IssueType:New Project
Summary:项目说明,介绍一下项目
GroupId:项目的GroupId
ProjectURL:项目主页的URL,填写项目主页地址
SCMurl:项目git代码的URL,填写仓库git代码地址
其他的选填按照自己的项目情况填写
填写完毕后点击Create后,工单即创建成功,工单此时状态为Open
1.3、工单审核
工单创建成功几小时内(晚上11过后回复时间比较快,国内与美国有时差)会有工作人员审核工单,在工单Comments区问你是否有Group Id对应的那个域名的所有权(此处为全英文回复,如果英文不好的同事可以使用谷歌翻译,个人感觉比百度翻译准确太多),如果有的话就直接回复相关信息。如果自己没有域名的话可以挂在开源的域名(如gitee.com或github.com)下面,例如com.gitee.cqdevops,使用开源的域名有一点需要注意:Group Id必须与你的开源域名匹配,例如我的开源域名为https://gitee.com/cqdevops,Group Id必须以com.gitee.cqdevops做为开头,否则不能通过审核。审核通过就会得到Configuration has been prepared的回复并且jira工单状态变为Resolved,到此即可开始发布jar 包。
二、发布jar 包
2.1、配置maven settings.xml文件
在settings.xml文件servers配置下面添加server配置,用户名和密码为注册Sonatype时的用户名和密码
<servers>
<server>
<id>snapshot</id>
<username>用户名</username>
<password>密码</password>
</server>
<server>
<id>releases</id>
<username>用户名</username>
<password>密码</password>
</server>
</servers>
2.2、配置项目pom.xml文件
在pom文件中添加如下配置
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>
<name>xxxxxxxx</name>
<description>xxxxx</description>
<url>xxxx</url>
<!-- license 信息 -->
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>actable</distribution>
</license>
</licenses>
<!-- 开发者信息 -->
<developers>
<developer>
<name>xxx</name>
<email>xxxxx@email.com</email>
<organization>xxxx</organization>
<url>xxxxxxxxxxxxxxxxxx</url>
</developer>
</developers>
<!-- SCM信息 -->
<scm>
<connection>xxxxx</connection>
<developerConnection>xxxxx</developerConnection>
<url>https://gitee.com/sunchenbin/mybatis-enhance</url>
<tag>1.0</tag>
</scm>
<!-- 配置生成javadoc和sources包的插件 -->
<build>
<plugins>
<!--指定编译器版本-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<!--打包源码-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!--打包文档注释-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.3</version>
<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>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<distributionManagement>
<snapshotRepository>
<!-- 这个id需要在setting.xml中设置 -->
<id>snapshot</id>
<!-- 这里的url就是Issue中回复的snapshots 的repo地址-->
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>releases</id>
<!-- 这里的url就是Issue中回复的staging 的repo地址-->
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
2.3、使用gpg生成密钥
2.3.1、安装gpg
<!-- windows -->
Windows系统直接去https://www.gpg4win.org/download.html下载Gpg4win
<!-- mac -->
brew install gpg
<!-- Linux -->
yum install gpg
2.3.2、查看gpg版本
gpg --version
2.3.3、生成密钥,提示输入:Real name、Email address,根据提示输入大写O确认,然后弹出一个输入密码的对话框,请记住该密码
gpg --gen-key
2.3.4、查看公钥
gpg --list-keys
2.3.5、将公钥发布到 gpg 密钥服务器(gpg --list-keys可以看到公钥id)
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys xxxxxxxxxxxxxxxx
2.3.6、查询公钥是否发布成功,如果没有发成功再发布一次
gpg --keyserverhkp://pool.sks-keyservers.net --recv-keys xxxxxxxxxxxxxxxx
注意:有可能因为gpg版本太高,导致发布时出现,处理方式如下:
在gpg的安装目录(~/.gnup
)下新建两个配置文件: gpg.conf
:
use-agent
pinentry-mode loopback
gpg-agent.conf
:
allow-loopback-pinentry
2.4、上传构件到 OSS 中
此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,过程中可能需要你手动输入密码
注意:使用mvn命令中默认使用settings.xml文件中的配置,请确保上文servers配置正确配置到settings.xml文件中
<!-- 自己配置profiles时 -->
mvn clean deploy -P releases
<!-- 使用官网parent时使用 -->
mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密钥密码"
2.5、在OSS 系统中发布构件
登录 https://oss.sonatype.org系统,帐号和密码为注册Sonatype时的帐号和密码。在 Staging Repositories 中查看刚才已上传的jar 包,这些构件目前是放在Staging 仓库中。此时,该构件的状态为 Open,需要勾选它,然后点击 Close 按钮。系统会自动验证该构件是否满足指定要求,当验证完毕后,状态会变为Closed。最后,点击 Release 按钮来发布该构件
2.6、通知 Sonatype 构件已成功发布
在之前创建的jira工单下面回复“I was completed”,通知工作人员为需要发布的构件做审批,当审批通过后,会关闭该jira工单并且会收到邮件通知。至此,就可以在maven的中央仓库中搜索到自己发布的构件,可以直接在pom.xml中使用了。
三、总结
第一次发布jar 包到maven中央仓库断断续续的进行了四天左右,因为是第一次发布到中央仓库,不清楚jira工单审批时间,耽误一些时间,并且其间遇到了很多没有预想到的问题。特此记录下来,希望能给更多的人一些帮助吧。