主要介绍利用Sonatype将jar或aar提交到Maven的中央仓库。
是不是希望将自己的jar或是aar传到maven官方库中,在The Central Repository中可以被其他人搜索使用呢,是的话,往下看吧。
1、Sonatype简介
Sonatype使用Nexus为开源项目提供托管服务。你可以通过它发布快照(snapshot)或是稳定版(release)到Maven中央仓库。我们只要注册一个Sonatype的JIRA账号、创建一个JIRA
ticket,然后对POM文件稍作配置即可。
2、注册账号
打开https://issues.sonatype.org/ 注册Sonatype的JIRA账号,这个账号在后面配置maven
server时需要使用。
打开Create a OSSRH ticke 创建一个JIRA
ticket,你的一个项目对应着这里的一个JIRA
ticket,
其中Summary可以填写项目名,Description填写项目介绍。
Group
Id非常重要,必须是你项目pom.xml中的group id的父级,做为你账号和该项目关联的标记。如我项目pom.xml中group
id为cn.trinea.android.common,为了我所有项目都可以发布,申请填写的Group
Id为cn.trinea
其他按照提示填写即可。完成后大概2个工作日左右,该Issue会变为 _resolved_
状态表示可用,在可用前下面的过程除了第7步 正式发布外,其他的都没有问题。
3、软件环境
(1) JDK5以上
(2) Subversion 或是
Git
这是根据你项目需要的,你项目用什么版本控制管理工具
(3) Maven 2.2.1+
(4)
GPG,用于对需要上传的文件加密和签名
下载地址:https://www.gnupg.org/download/index.html,windows版下载地址:http://gpg4win.org/
安装完成后通过在命令行模式下通过
1 |
gpg--gen-key |
命令生成自己的public key,除了姓名、邮箱、备注外其他都可以使用默认配置,最后需要填写一个passphase,注意它在后面mvn release签名时需要。
public key生成结束后用
1 |
gpg--list-keys |
命令查看key内容,如下:
1
2
3
4
5 |
C:/Users/Trinea/AppData/Roaming/gnupg/pubring.gpg
--------------------------------------------------------
pub2048R/C6EED57A2014-05-11
uidTrinea(www.trinea.cn)<trinea.cn@gmail.com>
sub2048R/932D6F332014-05-11 |
其中C6EED57A为key id,需要将他上报给服务器,命令如下:
1 |
gpg--keyserverhkp://pool.sks-keyservers.net--send-keysC6EED57A |
这样便完成了gpg public key的创建和上报操作。
如果有兴趣深入了解可见:How To Generate PGP Signatures With Maven
4、标准的Pom文件格式
(1)
POM文件必须含有以下元素
<modelVersion>
<groupId>
<artifactId>
<version>
<packaging>
<name>
<description>
<url>
<licenses>
<scm><url>
<scm><connection>
<developers>
(2) 如果是jar文件,必须包含-javadoc.jar及-sources.jar,即需要在POM中配置build的相应plugin
关于pom.xml内容可参考:https://github.com/Trinea/android-common/blob/master/pom.xml
其中需要修改以下地方
(1) 相关元素信息改为你自己项目信息。
(2) 必须保证parent或parent的parent为
1
2
3
4
5 |
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent> |
(3) 如果你版本控制使用的不是git,而是其他工具,配置见POM and settings config
(4) 纯Java(非Android)工程需要将<packaging>aar</packaging>改为<packaging>jar</packaging>,并且去掉
1
2
3
4
5
6
7 |
<!--Android
deps-->
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>4.0.1.2</version>
<scope>provided</scope>
</dependency> |
和
1
2
3
4
5
6
7
8
9
10
11
12 |
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<sdk>
<platform>14</platform>
</sdk>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
<extensions>true</extensions>
</plugin> |
5、配置Maven仓库地址
在.m2目录下的settings.xml文件中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
<settings>
...
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
</servers>
...
</settings> |
将其中的your-jira-id和your-jira-pwd替换为你在https://issues.sonatype.org/上的用户名和密码。
m2 目录在linux下路径为/home/user-name/.m2,windows下路径为C:\Users\your-user-name\.m2
如果后面步骤中发现settings修改不生效可参考:Maven Sonatype Nexus return 401
6、编译上传
(1) 发布一个snapshot版本
mvn clean deploy
发布完成后登陆https://oss.sonatype.org (https://issues.sonatype.org/ 上的用户名和密码),通过下图步骤找到自己的Artifact(上传的jar或aar或pom等)
(2) 发布一个release版本
mvn release:clean release:prepare
release:perform
过程中需要通过GPG签名,需要输入上面的passphase。发布完成后我们依然可以通过类似上图步骤找到我们的Artifact
其他上传方式见Stage a Release
7、正式发布
这里的正式发布是指同步到Maven主仓库使得其他人可以使用。主要包括Close和Release两步,先Close后Release,分别如下图
其他不明白可以查看:Release
需要注意
(1) 在release时可能会出现
1
2 |
Releasefailed
Nexusreturnedanerror:ERROR403:Forbidden |
的403弹窗,这可能是因为在2中创建的JIRA ticket,状态还没有变为 _resolved_,等待可用即可。如果上面截图中你的Repository列表中Profile列的值不是你在创建JIRA ticket时的Group Id需要重新提交。
(2) 如果是第一次release,需要到之前你的JIRA ticket下,评论下告诉他们,你已经release了,需要同步下,我的JIRA ticket: OSSRH-9800. 如下图:
官方指南:Sonatype OSS Maven Repository Usage Guide