发布自己的包到Maven中央仓库中
现在Maven几乎成了Java事实上的包管理工具了,Gradle作为后起之秀,也是建立在Maven现有的大量仓库资源之上。使用
Maven Central Repository
可以很方便地解决第三方库依赖问题。那么,如何将自己开发的包也发布到Maven Central Repository
上去呢?
申请SonaType网站的用户
SonaType
是什么呢?提供开源项目仓库托管(Open Source Software Repository Hosting,简称OSSRH)服务
点进去网站以后跟着下面步骤创建
-
点击Create
Summary
:描述自己包的作用Description
:可写可不写,也是具体描述的Group Id
:填写自己的github地址Project URL
:填写你的项目的github地址就可以了SCM url
:同样的我填写的也是github的地址
填写完成后,就点击
Create
即可,随后如果审批通过的话就会在你申请的邮件箱中收到通过的邮件
配置gpg加密jar包上传到构件仓库里面
-
安装
Gpg4win
- Mac:直接在控制台
brew install gpg
即可 - Windows:下载Gpg4win生成秘钥
- Mac:直接在控制台
-
命令行生成生成秘钥
gpg --gen-key
-
根据提示填写姓名、邮箱、备注等。生成完了之后。
可以用下面的命令进行查看key的内容
gpg --list-keys --keyid-format short
可以看到
394A524C
就是你的key值了,此时需要将其上报给服务器中gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 你的key值
-
查询是否上报成功
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 你的key值
配置Gradle
在.gradle
中创建gradle.properties
文件夹,用于存储秘钥信息。里面内容如下
signing.keyId=你的key值
signing.password=之前申请时输入的密码
signing.secretKeyRingFile=在之前用gpg --list-keys --keyid-format short输出秘钥信息时,有个路径。
然后在build.gradle
中配置如下
group 'com.github.modouxiansheng'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing' //使用signing plugin做数字签名
apply plugin: 'idea'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
uploadArchives {
repositories {
mavenDeployer {
//为Pom文件做数字签名
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
//指定项目部署到的中央库地址,UserName和Password就是Part 1中注册的账号。
repository(url: "http://oss.sonatype.org/content/repositories/snapshots/") {
authentication(userName: "UserName", password: "Password")
}
//构造项目的Pom文件,参见Pom文件的规范,不要遗漏必填项
pom.project {
name project.name
packaging 'jar'
description 'Toggle is a little java tool to make your life easier when you try to use Feature Toggle in Java.'
url 'http://github.com/modouxiansheng/convenientUtil'
scm {
url 'scm:git@github.com:modouxiansheng/convenientUtil.git'
connection 'scm:git@github.com:modouxiansheng/convenientUtil.git'
developerConnection 'git@github.com:modouxiansheng/convenientUtil.git'
}
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
developers {
developer {
id 'modouxiansheng'
name 'D.Hu'
}
}
}
}
}
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from 'build/docs/javadoc'
}
task sourcesJar(type: Jar) {
classifier = 'sources'
from sourceSets.main.allSource
}
artifacts {
archives jar
archives javadocJar
archives sourcesJar
}
//为所有的jar包做数字签名
signing {
sign configurations.archives
}
然后在Idea
中如下图点击即可
如果你在控制台上看到Could not find metadata cn.yerl:android-promise/maven-metadata.xml in remote (http://oss.sonatype.org/service/local/staging/deploy/maven2),不需要理会。
在中间库中进行审批
http://oss.sonatype.org/#stagingRepositories
用你的SonaType
的账号密码进行登陆后,点击左边的Staging Repositories
然后根据所写的Group Id
进行查询。如果在Staging Repositories
中查找不到你的项目,但是在Nexus公有库中是可以查找到你的项目的话。
那么这个问题可以忽略,因为这个是nexus-staging-maven-plugin
插件中autoReleaseAfterClose
自动设置为了True,所以就自动给close->release->drop
三步,相当于自动给你做了。所以等待两个小时就会在中央仓库查找到了。
通知Sonatype
构件已成功发布,在之前创建的Issue中回复一条The component has been successfully released通知工作人员为需要发布的构件做审批,发布后会关闭该Issue。
查看是否jar包上传成功
在中央仓库中查找就能看到已经上传的Jar包了
遇到的坑
-
当第一次进行上传的时候,version不要写成
SNAPSHOT
的。这在网上都是这么说的,因为网上的大部分是用Maven上传的,所以它根据后面的版本号将其上传到哪个库中。而在Gradle中限定上传到哪个库中是在repository
中的url配置的http://oss.sonatype.org/content/repositories/snapshots/ http://oss.sonatype.org/content/repositories/releases/
如果第一次上传了
SNAPSHOT
版本的话,那么会在Sonartype
看到管理员回复的下面一段话I only see a SNAPSHOT release in oss.sonatype.org Note that SNAPSHOTs won't sync to Maven Central. See: http://central.sonatype.org/pages/apache-maven.html#performing-a-snapshot-deployment Comment again when you've promoted a release version, and the sync to Central will activate.
大概意思就是在第一次的时候不能上传
SNAPSHOT
只有第一次成功了以后才可上传。 -
Return code is: 400, ReasonPhrase: Bad Request
在知道了第一次不能上传
SNAPSHOT
版本以后,所以我就把版本号改成了Release
,然后上传但是一直报这个错。最后找到了原因是因为版本号写的是Release
但是url写的是SNAPSHOT
版本的。所以一直上传不上去。