最近想把Jar包上传到Maven中央仓库,在网上搜了下没有特别详细的文章,所以自己造个轮子把具体步骤记录下来。
适合人群
- 了解如何使用Gradle构建项目
步骤
- 创建Bintray账号
- 创建仓库
- GPG签名
3.1. 使用Bintray公共密钥
3.2. 使用个人密钥 - 创建Sonatype账号
- 申请权限
- 编写Gradle脚本
- 发布
开始
1.创建Bintray账号
前往 bintray.com ,右上角点击 Sign In 跳转到登录页面,可以选择通过第三方账号登录或者自己注册一个,方便起见我直接用了Github账号。
2.创建仓库
登录后点击左侧的 Add new Repository按钮 跳转到创建仓库的页面,Name一栏填写仓库的名字,这里我写的是maven,仓库类型选 Maven ,创建完成后仓库就可以使用了。
3.GPG签名
GPG(GnuPG)是一款非对称加密软件,上传的Jar包需要用GPG生成签名文件,否则是不能同步到MavenCentral的,使用GPG给文件签名需要有公钥,可以用Bintray提供的默认的公钥或者使用自己生成的公钥,以下两种方法二选一。
3.1.使用Bintray公共密钥
该方法比较便捷,不需要进行生成密钥等繁琐操作。首先进入你创建的仓库页面,点击 Edit ,进入编辑页面。
然后勾选如图所示的选项,当你上传Jar文件时系统就会自动帮你生成签名文件。
3.2.使用个人密钥
首先需要下载 GnuPG ,以MacOS为例,下载 GnuPG for OS X 。
下载安装完成后测试下是否可用:
gpg2 --version
生成key,过程中需要依次输入Name,Email,Passphase,其中email会作为你的用户ID。需要注意的是如果设置了Passphase,Bintray就无法对你的上传的文件自动签名。
gpg2 --gen-key
查看刚才生成的key:
gpg2 --list-keys
然后把公钥 发布到服务器:
gpg2 --keyserver hkp://ha.pool.sks-keyservers.net --send-keys pojo.zhang@gmail.com
在发布过程中我遇到了 gpg: keyserver send failed: No route to host的错误,解决方法是多试几个地址,下面是几个候选地址:
导出公钥和私钥:
gpg2 --armor --export pojo.zhang@gmail.com > public_key_sender.asc
gpg2 --armor --export-secret-key pojo.zhang@gmail.com > private_key_sender.asc
然后回到Bintray的界面,点击右上角导航栏的头像,点击 Edit Profile ,
跳转到以下页面,点击GPG Signing。
把刚才导出的公钥和私钥粘贴进去,包括虚线的两行文本,然后点击 Update。
回到仓库页面,点击Edit。
开启自动签名功能,配置就完成了。
4.创建Sonatype账号
前往 issues.sonatype.org/login.jsp 进行注册。
5.申请权限
第一次登录时会让你设置语言、头像等信息,按需设置。
到如下图所示步骤时,选择中间的 Create an issue 。
在跳转的页面中如下图所示填写。
接下来要填写项目相关的一些信息,这里说明一下几个必填项:
- Summary - 项目简介
- Group Id - 如果你有自己的域名就可以填在这里,比如io.spring,或者com.github.xxx,如果你填了自己的域名,提交申请后Sonatype的人会向你确认你拥有这个域名
- Project URL - 项目的网站地址
- SCM url - git或svn仓库地址
点击Create提交你的申请。
通常第二天就能得到申请的答复,可以在Sonatype JIRA的Comments标签中查看,也会以邮件的形式发到你注册时用的邮箱中。
等到JIRA上Status显示成 RESOLVED ,你的仓库就能使用了。
6.编写Gradle脚本
万事俱备,只欠东风!准备好你的项目,把下面的Gradle脚本加入到项目中。
buildscript {
repositories {
//使用阿里的maven镜像
maven { url 'http://maven.aliyun.com/nexus/content/groups/public'}
}
dependencies {
//引入bintray插件
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
}
}
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
apply plugin: 'java-library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'
def pomConfig = {
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 "developerName"
name "developerName"
email "developer@example.com"
}
}
scm {
//项目网站
url "https://github.com/example"
}
}
publishing {
publications {
MyPublication(MavenPublication) {
from components.java
artifact sourcesJar
artifact javadocJar
groupId 'com.example'
artifactId 'projectName'//com.example.projectName
version alohaVersion
pom.withXml {
def root = asNode()
root.appendNode('description', 'project description')
root.appendNode('name', 'projectName')
root.appendNode('url', 'https://github.com/example')
root.children().last() + pomConfig
}
}
}
}
bintray {
user = BINTRAY_USER//bintray的用户名,即显示在导航栏右侧的名字
key = BINTRAY_KEY//Api key,见下文
publications = ['MyPublication']//关联到上文maven publication的名字
publish = true//如果false,还需要到网页上手动发布
pkg {
repo = 'maven'
name = 'projectName'
licenses = ['Apache-2.0']
vcsUrl = 'https://github.com/example.git'
labels = ['java', 'spring', 'example']
version {
name = '1.0.0-FINAL'
desc = 'description'
released = new Date()
vcsTag = '1.0.0-FINAL'
mavenCentralSync {
sync = true//是否同步到中央仓库
user = OSSRH_USER//见下文
password = OSSRH_PASSWORD//见下文
}
}
}
}
其中 BINTRAY_KEY 的值设为Api key,从下图所示位置获取:
OSSRH_USER 和 OSSRH_PASSWORD (OSSRH = Open Source Software Repository Hosting ) 需要到以下地址查看:
使用你的Sonatype账号登录,点击 Profile :
点击 Access User Token 查看你的Token:
左边输入框是你的username,右边是你的密码,建议把账号有关的信息从环境变量中读取,不要提交到VCS中。
7.发布
执行gradle命令进行发布:
./gradlew bintrayUpload
首次发布时如果Gradle设置了同步到MavenCentral,那么会出现以下的错误提示:
> Could not sync 'pojozhang/maven/com.example:projectName/1.0.0-FINAL' to Maven Central: HTTP/1.1 403 Forbidden [message:In order to sync to Maven Central your package must be included in the JCenter repository]
让我们回到Bintray上之前创建的maven仓库,这时你能在仓库的页面看到你刚才上传的包了,类似下图:
点击包名,跳转后,在页面的右侧你会找到 Add to JCenter 的按钮,点击它继续跳转。
你可以填写一些信息,也可以直接点击Send,过一段时间,系统会发送邮件提示你申请已经通过。
再回到刚才包的页面,点击 Maven Central,输入你的Sonatype的Token信息点击Sync,就可以完成同步了。第一次同步成功后,Sonatype也会通过邮件告知你 。
以后再发布新版本的时候直接执行Gradle命令就行了。同步完成后可以马上在 https://oss.sonatype.org 进行搜索,但是 https://mvnrepository.com/ 的搜索并不是实时的,需要等待一段时间,通常搜索结果第二天就能更新。
结尾
有几个点要注意:
- 上传到Sonatype的文件无法被删除,要更新文件只能上传新的版本,Bintray上的文件可以自由删除。
- Sonatype的几个网址比较难找,最好记一下。
- 账号不要提交到VCS中。
- 欢迎补充!