最近利用工作闲暇之余,开发了一个基于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, 其他按照自己的项目情况填写。

artifactory网页 怎么上传jar到maven_jar

artifactory网页 怎么上传jar到maven_git_02

必填项

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 包。

artifactory网页 怎么上传jar到maven_maven_03

artifactory网页 怎么上传jar到maven_git_04

二、发布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 按钮来发布该构件

artifactory网页 怎么上传jar到maven_maven_05

2.6、通知 Sonatype 构件已成功发布

在之前创建的jira工单下面回复“I was completed”,通知工作人员为需要发布的构件做审批,当审批通过后,会关闭该jira工单并且会收到邮件通知。至此,就可以在maven的中央仓库中搜索到自己发布的构件,可以直接在pom.xml中使用了。

artifactory网页 怎么上传jar到maven_发布jar_06

三、总结

第一次发布jar 包到maven中央仓库断断续续的进行了四天左右,因为是第一次发布到中央仓库,不清楚jira工单审批时间,耽误一些时间,并且其间遇到了很多没有预想到的问题。特此记录下来,希望能给更多的人一些帮助吧。