向Maven中央仓库提交JAR包
本文将详细介绍所有向Maven中央仓库提交SDK(对于JAVA即是jar包)的流程。如果您已经完成了整个流程但遇到一些问题,可以直接跳到文末,那里总结了很多遇到的问题以及解决的方案。
1. sonatype工单
为了向Maven中央仓库提交SDK,我们首先要向sonatype系统提交工单
-
如果没有账户,首先注册账户
-
选择Create Issue 创建发布 按照要求填写信息
-
其中需要注意的是,groupId就是我们jar包导入时的groupld,一般我们使用域名
-
点击确定后需要等待工作人员review,美国有时差,往往需要一天的确认时间
-
工作人员确定后,Issue的状态会变为绿色的RESOLVED
-
开通时工作人员会在Issue下面的comments回复信息,信息包含了我们发布release、snapshots版本的地址。这个地址我们之后配置要用到,我们发布自己的包到这两个地址。
2.GPG
GPG是一种加密签名命令行工具,maven官方要求在上传时使用这个软件做加密。在向Maven中央仓库提交SDK的过程中,安装并启用GPG主要需要进行以下四个步骤。
2.1 安装
# mac 环境
brew install gpg
# Debian / Ubuntu 环境
sudo apt-get install gnupg
# Fedora / CentOS环境
yum install gnupg
2.2 验证是否安装成功
# mac 环境
# mac环境一切gpg开头的命令,都需要使用gpg2代替
gpg2 --help
# 其他环境
gpg --help
2.3 生成**
输入下面的命令后,会进行一系列步骤,基本都选择默认选项即可。还会被GPG要求填写真实姓名,填写电子邮箱。之后需要输入一个私钥密码,这个私钥密码用来保护我们的私钥不被滥用,输入一个密码并记住它。具体为什么需要进行上述这些步骤,可见GPG简介。
gpg --gen-key
2.4 上传公钥
生成后要将公钥上传至服务器。下述命令最后用自己的公钥替换,公钥是一串十六进制的数字,例:DE346FA5。请不要使用上述举例的公钥,要使用上一步自己生成的公钥。
gpg --keyserver http://http-keys.gnupg.net --send-keys 你的公钥
3. /.m2/setting.xml
setting.xml文件用来进行账户密码的配置。
理论上,如果我们想让整台机器都能适用这个上传功能,我们应该在conf/目录下的setting.xml文件进行配置。但一般情况下在.m2/目录下配置就能满足需要,还有就是有时我们没有修改conf/目录下文件的权限。
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>注册sonatype工单的用户名</username>
<password>注册sonatype工单的密码</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>注册sonatype工单的用户名</username>
<password>注册sonatype工单的密码</password>
</server>
</servers>
-
上述配置在<servers>标签内配置
-
<username>和<password>需要填写第一步中自己注册的sonatype用户名和密码
-
<id>要和下面配置的POM适配,理论上自己设置也可以。为了增加可靠性,建议使用上文的<id>
-
有的人的配置只用了一个<server>,这也是可以的,因为这只是一个读取用户名和密码的功能。这里配置了两个是为了在语义上更便于理解,snapshots结尾的是快照版本,staging结尾的是发布版本
4. POM.xml
这里的POM文件指的是我们要发布的Jar项目的目录中的根POM文件。POM文件中除了自己需要配置的依赖和插件以外,必须要进行下面这些内容的配置。
4.1 parent
首先在POM文件开始处,整个<project>标签下配置<parent>,以下的内容都是固定的不需要修改。
<parent>的作用是为我们导入很多依赖的包,而我们不需要再额外进行声明。配置<parent>减少了我们对整个POM的改动,但如果其中有和我们自己配置冲突的jar,也可以不使用<parent>,但一定要进入oss-parent这个构件,把所有其他需要的依赖和插件都手动配置到POM中。
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>
4.2 distributionManagement
<distributionManagement>中配置了我们上传到中央仓库时的地址和账号密码。这个标签可以配置在<project>下,如果你有<profile>也可以配置在其中。其中的内容有可能需要修改。
其中<snapshotRepository>内表示快照版本发布的信息,<repository>内是发布版本的信息。<id>对应于setting.xml文件中的<server>中的<id>,如果你上面的setting是按照本文的方式配置那么就不需要修改。<url>是第一步我们在创建工单时,管理员在审批同意后在下面回复的地址。一般的情况下,理论上我们的地址应该都是一样的。回复的形式如下。
按照回复中提供的地址填入url即可,有的人会在<snapshotRepository>和<repository>内配置一个叫做<name>的标签,这个标签不是必须的。
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-staging</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
4.3 licenses developers scm
上述三个标签都是Maven要求我们必须提供的,但实际上对于SDK上传成功的帮助并不大。配置的位置在<project>标签内。内容是自己配置的,希望不要直接复制下面的代码。
-
licenses
-
name - 随便设置一个name
-
url - 一个在第一步提交工单时填入的项目url
-
-
developer
-
id - 随便设置一个id
-
name - 开发者姓名,随意填写
-
email - 自己的邮箱
-
-
scm
-
scm中的三个标签可以都不填
-
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<id>gwon sdk</id>
<name>GWON SDK</name>
<email>[email protected]</email>
</developer>
</developers>
<scm>
<connection></connection>
<developerConnection></developerConnection>
<url></url>
</scm>
4.4 name url description
上述三个标签都是Maven要求我们必须提供的,但实际上对于SDK上传成功的帮助并不大。配置的位置在<project>标签内。内容是自己配置的,希望不要直接复制下面的代码。
这三个标签的内容均可随意填写。
<name>GWON SDK</name>
<url>https://www.gwon.com/</url>
<description>this is my sdk, ths.</description>
4.5 maven运行插件
我们需要配置一些maven运行中要使用到的插件,下面的内容配置在<project> -> <build> -> <plugins> 中,是不需要修改的,复制即可。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration></configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
<configuration>
<encoding>${chartset.UTF8}</encoding>
<aggregate>true</aggregate>
<charset>${chartset.UTF8}</charset>
<docencoding>${chartset.UTF8}</docencoding>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
</execution>
</executions>
</plugin>
4.6 nexus-staging-maven-plugin
一般情况下我们提交了SDK到中央仓库后,需要提交到sonatype进行审批再发布,这个插件可以帮我们自动提交,让整个过程自动化,虽然这个插件不是必须的,但是强烈推荐使用的插件。内容配置在<project> -> <build> -> <plugins> 中,其中有一处需要修改,<configuration> -> <serverId> 需要按照我们在setting文件中配置的<id>设置,如果你上面的setting是按照本文的方式配置那么就不需要修改。
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.3</version>
<extensions>true</extensions>
<configuration>
<serverId>sonatype-nexus-staging</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
4.7 maven-gpg-plugin
这个插件帮助我们自动进行gpg的签名,虽然这个插件不是必须的,但是强烈推荐使用的插件。内容配置在<project> -> <build> -> <plugins> 中,是不需要修改的,复制即可。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
5. 部署
部署只需要使用mvn命令即可。下面的命令中最后需要使用你的私钥密码,clean是可选项,用来清理之前生成的构件,-P sonatype-oss-release 是必选项,这个<profile>在<parent>中,如果你使用了它那么这是必须要填写的。
mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=你的私钥密码"
6. 查看发布构件
-
进入sonatype并登录
-
点击左侧的Advanced Search搜索你的artifactId名称即可
7. 问题解决方案
在整个配置的过程中可能存在很多问题,下面对常见的问题提供一些解决的方案。
7.1 部署失败、某个包找不到、下载到lastUpdate结尾的jar文件
造成这些的原因可能不是你的项目存在问题,而是mvn命令在执行的时候到中央仓库下载相关包的速度太慢,导致时间超限直接报错。解决方法是用国内的Maven仓库镜像代理,下面提供一个比较快的阿里云镜像,我们将其配置在.m2/setting.xml中<mirrors>内即可,不需要下面修改任何一处。
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
7.2 GPG报错、GPG找不到
有很多人安装了GPG之后没把自己的公钥上传,这会导致Maven中央仓库找不到你的公钥无法匹配。解决方法是运行命令行上传公钥。
gpg --keyserver http://http-keys.gnupg.net --send-keys 你的公钥
7.3 在部署的过程中跳出提示框要求输入GPG密码
理论上这不是问题,但是有的情况下我们需要自动化整个发布流程不能存在这种交互的形式。解决方法是在POM文件中导入相关包跳过这个步骤。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
7.4 mac电脑无法运行gpg命令
mac中的gpg是比较特殊的,我们在命令行中要用gpg2来代替gpg。下面是mac电脑的安装方式。
brew install gpg
gpg2 --help
gpg2 --gen-key
gpg2 --keyserver http://http-keys.gnupg.net --send-keys 你的公钥
7.5 mac电脑部署过程中gpg报错
导致mac在部署中也会出现gpg错误的一个原因和7.4是一样的,为了解决这个问题,我们需要在setting中额外配置信息。下面的配置要将自己的私钥密码填写进去,除此之外不需要任何修改。
<profiles>
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>你的私钥密码</gpg.passphrase>
</properties>
</profile>
</profiles>
7.6 我在sonatype上提交了工单但一直不能审批通过
理论上,只要我们在groupId中填写的是自己的域名,整个审批流程是没有被拒绝的理由的。如果一直不能审批通过可能是因为他们的公司在美国和中国有时差,他们的办公时间是我们的晚上,所以请耐心等待。