作者个人网站:http://www.harddone.com
纸上得来终觉浅。
一直以为发布AAR到jcenter是非常简单的事,跟发布到私有服务器nexus应该没太多差别。没想到自己动手做过才知道千万道坑。
本文将记录在Android Studio 3.3.2下,如何上传用kotlin开发的aar到jcenter服务器以及遇到的问题。参考来自这篇博文,写的非常好,详细的介绍了许多的基本概念和发布步骤。
一、 注册Jcenter 个人账号
这里请注意,Bintray官网,请选择“For an Open Source Account”注册账号。
二、创建Repository和Package
以本次测试的工程为例,我想在Jcenter上发布一个测试的Android SDK, 自定义命名为LazySDK, 该SDK下目前只包含一个Sub-SDK包:customviews, 该包主要是封装一些日常项目中常用的view。所以我可以在Bintray先创建一个仓库命名为LazySDK,然后在仓库中再创建一个包为customviews.
第一步:创建Reprository:
第二部:创建Package
进入第一步创建的仓库“LazySDK",新建Package,然后填写Package name等基本信息后保存:
三、配置Android Studio工程
在准备配置之前,请先确保工程没有错误。以本次测试为例:本地创建了一个LazySDK的工程,Kotlin为开发语言,工程中依赖Module:customviews.
第一步:配置upload脚本
(1)在project build.gradle文件中配置dependencies:
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
classpath 'org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.18'
}
(2)在project目录下创建: jcenter_push.gradle
(3)在library moudle builde.gradle中引用 jcenter_push.gradle, 首先在ext中配置 jcenter_push.gradle需要用到的变量值,这个样做的目的是如果以后工程依赖多个module的时候,先在各自的build.gradle中定义跟自己相关的仓库名称等信息,然后共用一个jcenter_push.gradle. (未验证)
ext {
bintrayRepo ='LazySDK'
bintrayName ='customviews'
publishedGroupId ='com.lazy.sdk'
libraryName ='customviews'
artifact ='customviews'
libraryDescription ='Custom vies on Android'
siteUrl ='https://github.com/LazyBonesLZ/LazySDK.git'
gitUrl ='https://github.com/LazyBonesLZ/LazySDK.git'
libraryVersion ='0.0.1'
developerId ='lazyboneslz'
developerName ='TJL'
developerEmail ='[email protected]'
licenseName ='The Apache Software License, Version 2.0'
licenseUrl ='http://www.apache.org/licenses/LICENSE-2.0.txt'
allLicenses = ["Apache-2.0"]
}
apply from: '../jcenter_push.gradle'
四、install & upload
(1)执行./gradlew install, 验证是否有问题,如果一切顺利,你会看到 Build Successful
(2) 然后执行: ./gradlew bintrayUpload,如果一切顺利,你会看到 Build Successful
五、Add to Jcenter
到目前为止,上传的SDK还没有正式发布到Jcenter,只在你自己的Bintray的Maven仓库。你可以在project 的build.gradle中指定repository url来使用。
repositories {
maven{
url 'https://dl.bintray.com/lazyboneslz/LazySDK/'
}
google()
jcenter()
}
然后在app build.gradle田间dependencies
implementation com.lazy.sdk:customviews:0.0.1'
这种通过配置repository url来引用的方式,不是最好的方式,我们不可能有10个仓库,就配置10个URL吧? 所以,需要把sdk发送到Jcenter服务器,这样我们就可以不用配置自定义的repository url了。
然后直接点击“Send",不用填写任何信息都可以。
然后就等JCenter 审核,一般需要几个小时。我是头一天12点左右发送的,但是等了一下午都没看到通过。第二天上班发现已经通过了,可以不配置自定义的repository url 直接引用JCenter所上传 SDK。
六、Github源码
七、备注
本次测试并没有按照所参考的博文那样,自动将内容同步到maven central , 所以并未配置GPG相关的信息。
=========================================>
八、遇到的问题
1. Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): 'xxx/javadoc/javadoc.options':
本项目是kotlin开发,在配置中如下配置:
(1) 在project build.gradle文件中配置dependencies:
dependencies {
........
classpath 'org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.18'
}
(2) 在jcenter_push.gradle中加入:
if (project.hasProperty("kotlin")) {//Kotlin libraries
task sourcesJar(type: Jar) {
classifier ='sources'
from android.sourceSets.main.java.srcDirs
}
task javadoc(type: Javadoc,dependsOn: dokka) {
}
}else 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'
fromsourceSets.main.allSource
}
}
//解决kotlin javadoc.options抱错
dokka {
outputFormat ='html'
outputDirectory ="$buildDir/javadoc"
}
2 . Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path 'xx/xxxxx.pom'
这个错误困扰了我很久,在网上都各种research,发现大多都是说工程中的module名称必须和artifactid一致,我按照提示改成一致以后问题依然存在,百思不得琪姐。最后去https://github.com/bintray/gradle-bintray-plugin查解释,也没发现什么特别需要的注意的地方。后来仔细对比官方demo的gradle,发现它还声明了group的值,而我是参看博文中的脚本来做,却没有group的相关声明,最后加上去,完美上传。
version = libraryVersion
//important, if null, will issue: Maven group, artifact or version not match ...
group = publishedGroupId
3. JCenter审核通过前,配置repository url引用sdk失败,原因是配置的URL错误,不能直接拷贝Bintray的仓库地址
maven{
url 'https://bintray.com/lazyboneslz/LazySDK/customviews'
}
正确的地址是:
maven{
url 'https://dl.bintray.com/lazyboneslz/LazySDK/customviews'
}