Android Studio 发布Java项目到Maven/JCenter仓库
03-27-2018 Tuesday, 发表于 Boston, USA
如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)
为了方便自己和他人引用我所写的java库,发布到 Maven/JCenter 上是最好不过了,利己利人,本文主要参考了
虽然这篇已经很详细的,但是我在实际操作中还是碰到了一些问题,所以自己再整理一遍,方便以后查阅
前言(MavenCentral和JCenter的区别)
-
maven中央仓库 是由Sonatype公司提供的服务, 它是Apache Maven、SBT和其他构建系统的默认仓库,并能很容易被Apache Ant/Ivy、Gradle和其他工具所使用。 开源组织例如Apache软件基金会、Eclipse基金会、JBoss和很多个人开源项目都将构件发布到中央仓库。 maven中央仓库已经将内容浏览功能禁掉了,可在 http://search.maven.org/ 查询构件。
-
JCenter 是由JFrog公司提供的Bintray中的Java仓库。 它是当前世界上最大的Java和Android开源软件构件仓库。 所有内容都通过内容分发网络(CDN)使用加密https连接获取。 JCenter是Goovy Grape内的默认仓库,Gradle内建支持(jcenter()仓库),非常易于在(可能除了Maven之外的)其他构建工具内进行配置。
第一步
[注意:你的工程必须为 library, 即:”apply plugin: ‘com.android.library’”, 否则后面的 bintray.gradle 会 build 失败]
第一步当然是注册 bintray 的账号, 得到 user 和 apiKey, apiKey 在你的 profile 里面,编辑你的 Profile,就能看到 API Key, 把你的 user 和 apiKey, 写入到工程目录下的 local.properties 文件中
1
2
project/
\_ local.properties
写入
1
2
bintray.user=XXX
bintray.apikey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
因为 apiKey 是一个非常隐私的东西,所以写在 local.properties 文件里面,避免和工程一起上传到VCS中, 因为一般 local.properties 文件是被写在 .gitignore 里面的,不过如果使用其他的 VCS, 要注意隐藏这个文件
第二步
在你的 Module 目录下新建一个 bintray.gradle
1
2
3
project/
\_ module/
\_ bintray.gradle
然后在这个 Module 的 build.gradle 里面追加下面代码
1
2
3
4
5
6
7
8
9
10
11
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
}
}
apply from: 'bintray.gradle'
第三步
将以下代码写入到 bintray.gradle 文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID
apply plugin: 'com.jfrog.bintray'
apply plugin: "com.jfrog.artifactory"
apply plugin: 'maven-publish'
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += configurations.compile
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
title "$PROJ_NAME $PROJ_VERSION"
}
}
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 DEVELOPER_ID
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId PROJ_ARTIFACTID
artifact javadocJar
artifact sourcesJar
pom.withXml {
def root = asNode()
root.appendNode('description', PROJ_DESCRIPTION)
root.children().last() + pomConfig
def dependenciesNode = root.appendNode('dependencies')
configurations.compile.allDependencies.each {
if (it.group && it.name && it.version) {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
}
afterEvaluate {
publishing.publications.mavenJava.artifact(bundleRelease)
}
bintray {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
publications = ['mavenJava']
publish = true
pkg {
repo = 'maven'
name = PROJ_NAME
desc = PROJ_DESCRIPTION
websiteUrl = PROJ_WEBSITEURL
issueTrackerUrl = PROJ_ISSUETRACKERURL
vcsUrl = PROJ_VCSURL
licenses = ['Apache-2.0']
publicDownloadNumbers = true
}
}
artifactory {
contextUrl = 'http://oss.jfrog.org/artifactory'
resolve {
repository {
repoKey = 'libs-release'
}
}
publish {
repository {
repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
username = bintray.user
password = bintray.key
maven = true
}
defaults {
//这里的名字和上面红色的名字一致即可,会将其包含的输出上传到jfrog上去
publications('mavenJava')
publishArtifacts = true
}
}
}
第四步
配置 gradle.properties 文件, 这个文件再工程根目录下
1
2
project/
\_ gradle.properties
写入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 库的包名
PROJ_GROUP=cn.kejin.android.views
# 库的ID
PROJ_ARTIFACTID=XImageView
# 库的版本
PROJ_VERSION=1.0.0
### 最后 gradle引用的形式就是 $PROJ_GROUP:$PROJ_ARTIFACTID:$PROJ_VERSION
# 库名
PROJ_NAME=XImageView
# 库的项目主页
PROJ_WEBSITEURL=https://github.com/liungkejin/XImageView
# 问题跟踪地址
PROJ_ISSUETRACKERURL=https://github.com/liungkejin/XImageView/issues
# VCS 地址
PROJ_VCSURL=https://github.com/liungkejin/XImageView.git
# 库的简单描述
PROJ_DESCRIPTION=Android View for show large image
# 开发者的信息, 可以随意
DEVELOPER_ID=GuilinDev
DEVELOPER_NAME=Guilin Zhang
DEVELOPER_EMAIL=GuilinDev@gmail.com
第五步
运行发布,在我参考的文章中,是直接运行
1
2
gradle bintrayUpload # 发布到bintray.com
gradle artifactoryPublish # 发布到oss.ifrog.org
但是这样做是很容易出错的,因为如果 javadoc 或者 javadocJar 等任务没有运行成功, 他会跳过,最后还是会将最后的 aar 发布上去。
所以我觉得,先单独运行各个子任务,都 Build 成功后,再来进行 publish和Upload
运行子任务可以使用 Android Studio 右边的 gradle 面板,如果什么都没有,可以点击面板上面的刷新按钮,出来后, 进入到你的库模块,找到这个几个子任务,双击执行
子任务有:
-
javadoc (生成 java 文档)
-
javadocJar (将java文档打包)
-
generatePomFileForMavenJavaPublication (生成 pom.xml)
-
bintrayUpload (发布到 bintray.com)
-
artifactoryPublish (发布到 oss.ifrog.org)
最后
当成功上传到 bintray 上后, 可以进入到你的首页, 可以在左下角看到 My Recent Package 下面有你刚上传的库 点击进入,然后点击右下方有一个 Add to JCenter 按钮, 填写 comments (不写也可以),点击 Send, 然后等待审核通过,
最后,通过之后,就可以方便的使用这种方式来引用你的库了
1
compile 'cn.kejin.android.views:XImageView:1.0.0'