Library的两种结构
当我们写下自己的组件库时,结构可能如下面两种方式:
当我们的库比较简单时采用第一种方式就足够了,但是当库比较复杂时,第二种拆分为多个组件的方式能够跟好的组织与提供服务。下面会介绍这两种结构的项目如何快速上传Jcenter。
注册Bintray
第一步首先是注册Bintray Open Source 账户,注册地址是 Create Your JFrog Bintray Account bintray.com/signup/oss, 请注意不要去Bintray主页注册为企业账户,否则删除账户需要在3个月后试用时长过期后才可以申请。
注册页面预览:
建立Maven仓库
账号建立并成功登录之后,你们看到的页面可能和下图类似:
不同之处可能是Owned Repositories部分是空的。 接下来就是建立自己的maven仓库了。 点击Owned Repositories区域的Add New Repository, 重点在于Type需要选择Maven项,其他部分根据自己的实际情况填写。
当创建成功之后,回自动进入的新的仓库页面,预览如下:
对单Module Library进行上传
既然仓库以及建立好了接下来就是对library将上传到刚刚建立的maven仓库了。
修改Project build.gradle
首先在project下的build.gradle脚本添加必要的依赖:
buildscript {
dependencies {
...
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
...
}
}
allprojects {
//如果是kotlin项目,请添加此项,纯Java项目请忽略
tasks.withType(Javadoc).all { enabled = false }
}
建立bintrayv1.gradle文件
然后在project目录下新建bintrayv1.gradle文件,内容如下:
apply plugin: 'com.jfrog.bintray'
version = libraryVersion
if (project.hasProperty("android")) { // Android libraries
task sourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
} else { // Java libraries
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
// Bintray
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['archives']
pkg {
repo = bintrayRepo
name = bintrayName
desc = libraryDescription
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = allLicenses
publish = true
publicDownloadNumbers = true
version {
desc = libraryDescription
gpg {
sign = true //Determines whether to GPG sign the files. The default is false
passphrase = properties.getProperty("bintray.gpg.password")
//Optional. The passphrase for GPG signing'
}
}
}
}
建立installv1.gradle文件
之后在project目录下再新建installv1.gradle文件,内容如下:
apply plugin: 'com.github.dcendents.android-maven'
group = publishedGroupId // Maven Group ID for the artifact
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'
groupId publishedGroupId
artifactId artifact
// Add your description here
name libraryName
description libraryDescription
url siteUrl
// Set your license
licenses {
license {
name licenseName
url licenseUrl
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
这里解释一下为什么要新建这两个文件,这两个文件是Bintray 为了方便上传library所编写的脚本,源文件位于github,为了避免gradle同步过程中由网络引发的错误,所以直接将其内置与项目中。源地址分别是:
若嫌麻烦,也可在后续引用到改文件的地方直接填入http链接,不必新建为本地文件。
填写Publish信息
在需要上传的module下建立publish.gradle文件,填写内容如下:
ext {
// 此处填写刚才建立的maven仓库的仓库名称
bintrayRepo = 'YourRepositoryName'
// library的group id
publishedGroupId = 'com.xxx.libraryName'
// library网站地址
siteUrl = ''
// library仓库地址
gitUrl = ''
// 注册时候的bintray username
developerId = ''
// 开发者名称
developerName = ''
// 开发者邮箱
developerEmail = ''
// 开源许可证(这里是Apache 2.0)
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
allLicenses = ["Apache-2.0"]
// library artifact(单个module一般就填写library name)
artifact = 'libraryName'
libraryName = ''
libraryVersion = ''
libraryDescription = ''
// bintrayName 是你在网页Repository页面能看到的名称
bintrayName = 'libraryName-' + artifact
}
apply from: '../installv1.gradle'
apply from: '../bintrayv1.gradle'
修改Module build.gradle文件
只需要在需要上传的module目录下的build.gradle文件的最后添加以下代码:
apply from: 'publish.gradle'
编辑local.properties文件
在bintray个人页面右上角头像处,点击Edit Profile进入个人信息编辑页面后,点击左下角的API Key, 会提示输入密码,输入密码后点击Copy To Clipboard就可以得到你自己的bintray api key。
然后修改project目录下的local.properties文件,在末尾添加下面的内容。
bintray.user=你的bintray username
bintray.apikey=刚才复制的bintray api key
在获取到bintray api key之后就可以进行上传了。
对多Module Library进行上传
如果只是单Module可以跳过此部分。
由于多Module library对于每个module而言,同属与同一个library,所以publish信息中大部分信息相同,所以便把这些相同的信息提取出来。
建立publish_info.gradle文件
我们选择把相同的信息提取到Project目录下到publish_info.gradle文件中,内容如下:
ext {
// 此处填写刚才建立的maven仓库的仓库名称
bintrayRepo = 'YourRepositoryName'
// library的group id
publishedGroupId = 'com.xxx.libraryName'
// library网站地址
siteUrl = ''
// library仓库地址
gitUrl = ''
// 注册时候的bintray username
developerId = ''
// 开发者名称
developerName = ''
// 开发者邮箱
developerEmail = ''
// 开源许可证(这里是Apache 2.0)
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
allLicenses = ["Apache-2.0"]
}
填写publish信息
在每个module目录下建立publish.gradle文件,内容如下:
ext {
// library artifact(单个module一般就填写library name)
artifact = 'libraryName'
libraryName = ''
libraryVersion = ''
libraryDescription = ''
// bintrayName 是你在网页Repository页面能看到的名称
bintrayName = 'libraryName-' + artifact
}
apply from: '../publish_info.gradle'
apply from: '../installv1.gradle'
apply from: '../bintrayv1.gradle'
其余步骤均与单个module上传部分相同。
上传
上传有两种方式:
-
命令行: 打开终端,在project目录下运行如下命令即可(modelName改为自己需要上传的module名称):
./gradlew moduleName:bU -
IDE可视化:
选择侧边栏中的gradle,然后导航至需要上传的module下,打开Tasks/publishing/bintrayUpload,双击执行任务即可。
上传成功后截图:
添加至Jcenter
新版Bintray网站改版之后Add to Jcenter被放置在了Actions按钮下。
点击Add to Jcenter按钮后,此时会弹出如下弹窗: 在填写相关信息后,点击Send,等待申请通过后,你的仓库便会被同步到Jcenter。
当申请通过后,你会在网站的Inbox收到如下信息:
这表明你的library已经被同步至Jcenter,接下来便可以在其他的Android项目里进行远程引用的,需要注意的是在每次library更新后,并不会马上被同步至Jcenter,而是需要等待一段时间。
删除Library/Repository
当不小心把信息填写错误后,我们可能需要删除错误的仓库和库。删除的方式如下:
进入Repository/Library 主页,在右上角的Actions选择Edit,然后选择右上角的Delete按钮,最后等待删除成功提示即可。