前言
上传开发库到Jcenter仓库,可以通过Bintray来管理。
Bintray本身也是一个仓库管理网站,比如可以建立自己的Maven仓库,当然也通过Bintray可以上传到JCenter。
开发库首先需要上传到Bintray,上传的常用方法有novoda和jfrog两种。
这里介绍的是通过novoda方式上传。
开发环境
Gradle Version:4.1
注:最新的gradle4.6版本与novoda0.8.0版本有冲突,
提示Error:Cause: com.novoda.gradle.release.AndroidLibrary$LibraryUsage.getDependencyConstraints()Ljava/util/Set;
classpath ‘com.android.tools.build:gradle:3.0.1’
classpath ‘com.jakewharton:butterknife-gradle-plugin:8.4.0’
classpath ‘com.novoda:bintray-release:0.8.0’
buildToolsVersion:26.0.2
compileSdkVersion:26
上传步骤
- 在上传的库工程的build.gradle文件中添加:
publish {
userOrg = 'ddnosh'
groupId = 'la.xiong.androidquick'
artifactId = 'AndroidQuick'
version = '1.0.1'
description = 'AndroidQuick is a quick architecture to make an app.'
website = "https://github.com/ddnosh/AndroidQuick"
}
- 在Android Studio的Terminal里输入:
gradlew clean generatePomFileForReleasePublication build bintrayUpload -PbintrayUser=Your_Bintray_Name -PbintrayKey=Your_Bintray_Key -PdryRun=false
简单吧,就这么两步即可完成JCenter的上传。当然,这里仅仅是介绍上传的方法,还有Bintray的注册、Maven仓库的建立、JCenter提交申请等未详细列出。
Tips
如果不想传到JCenter,而是仅仅想利用Bintray的Maven仓库,我们可以这么惭怍:
点击创建的Maven仓库,右上角有仓库的地址:https://dl.bintray.com/ddnosh/maven
然后在根目录的build.config文件中加上:
allprojects {
repositories {
jcenter()
mavenCentral()
maven { url "https://jitpack.io" }
maven { url "https://dl.bintray.com/ddnosh/maven" }
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
}
所遇到的坑
- 上传命令
如果使用gradlew clean build bintrayUpload这样的命令,也能上传成功,但是添加到JCenter的时候,会报错:Add a POM file to the latest version of your package. - 版本冲突
Error:Unable to find method ‘com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;’.
Possible causes for this unexpected error include:- Gradle’s dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network) - The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart) - Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.
- Gradle’s dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
原因是Android Studio3.0和ButterKnife冲突,需要将ButterKnife版本降低至8.4.0.
2018最新坑
- Add to JCenter被拒
如果按照上述方法,库是可以上传到Bintray,而且用自己的Maven仓库地址引用也没问题。
如果放在以前,点击Add to JCenter就可以申请上传到JCenter了,而且会审核通过。
但是如今出现的问题是,提交到JCenter的时候,JCenter却拒绝了,发送来的信息内容如下:
Hi,
JCenter hosts java applications that follow maven convention. In addition to the .pom file, your version should include a binary jar file, a sources jar, and optionally a javadoc jar.
Your files should be under a maven path layout. (See https://bintray.com/docs/usermanual/uploads/uploads_includingyourpackagesinjcenter.html)
Once those files are added, we’ll be glad to include your package in JCenter.
Regards,
JFrog Support
意思是没有按照Maven的规范,除了需要.pom文件外,还需要binary.jar、javadoc.jar、sources.jar文件。
好吧,如果按照网上提供的通过novoda上传到JCenter的方式行不通了。
不是需要这几个文件么,那么我们就手动生成,然后传到Bintray的Maven仓库里,然后再提交总可以了吧。
在library工程的build.gradle文件增加的代码如下:
tasks.withType(Javadoc) {//防止编码问题
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
然后build一下,AS会在build目录下的libs文件夹下生成对应的sources.jar和javadoc.jar文件。
注意操作顺序:
先不加上这些task,按照最上面的方式上传到JCenter的Maven仓库;、
然后加上这些task,本地build生成sources.jar和javadoc.jar文件。
然后把这两个文件上传到Bintray的Maven仓库,操作如下:
按照1、2、3的顺序,其中2的地址要拷贝下来,因为点击3后,需要输入。
最后点击“Add to JCenter”,等审核吧。
注:
手动把Bintray这个版本删了,然后本地task都打开,并且运行上传命令,那么这些aar、jar文件都会自动更新到Bintray上,并且不需要JCenter再次审核的。
审核通过一般会发来如下的信息:
Your request to include your package /ddnosh/maven/AndroidQuick in Bintray’s JCenter has been approved.
以后在工程里面就是用compile “xxx”的形式引入库工程。