Library Module上传Jcenter详解

将Library Module上传Jcenter的文章,网上一搜一大堆,主要分为两类,一类是正常的流程,使用gradle上传到Jcenter,还有一种较为简便,是将上传的方法封装成一个gradle插件,你直接依赖,设置,调用方法便可。在写这篇文章以前,我特地将两种方法都作了测试,我我的仍是感受用原生的方法较好,一是能了解上传流程,其次,遇到坑了也知道该怎么找问题。javascript

在开始以前,须要说明因为上传依赖的都是gradle,但愿开发者能有一些基本的gradle语法常识,因此这里推荐我以前写的两篇文章:
Android工程gradle详解
Groovy基础java


帐号注册

首先确定是须要去官网注册一个帐号:android


这一步就很少说了

准备

帐号有了,你要想上传Module,至少你要有一个Module,你能够新建,也可使用现有已经写好的。可是要注意,要上传的Module,必需要是Library Module,有人可能问,这有啥区别?
区别在这里:git

defaultConfig {
        minSdkVersion 9
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }复制代码

Library Module没有applicationId,App Module有applicationId,也就是你的包名。github

根目录中的配置:

注意这里说的是根目录,也就是Project的build.gradle:web

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'//2.1.2对应1.3
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0" //

    }
}复制代码

须要注意若是用的2.1.2的gradle使用的上传插件是1.3,若是别的版本,可能须要修改版本,不然编译会报错。api

正常来讲,根目录的配置就完成了。若是你的Project下的Module有多个要上传,建议将配置的基本资料放在这里:网络

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'//2.1.2对应1.3
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0" //

    }
}

allprojects {
    repositories {
        jcenter()
    }
}
ext {
    siteUrl = 'https://github.com/xxx/xxxx'
    gitUrl = 'https://github.com/xxxx/xxxx.git'
    group = "com.xxx.xxxx"
    version = "1.4"
    id = 'xxx'
    name = 'xxx'
    email =  xxxx@vip.qq.com'
    packaging = 'aar'

}
task clean(type: Delete) {
    delete rootProject.buildDir
}复制代码

看到上面代码中ext部分就是须要本身根据本身工程信息填写的部分。
好了,这里的配置就完成了app

用户名和API KEY

这两个信息咱们须要写在local.properties中,固然,你可能会问为何非要写在这个文件中,不能写在刚才的ext中吗?
能够,可是这两个信息涉及保密的东西,通常不对外,你将代码上传到github上,build.gradle文件是暴露的,可是local.properties是不暴露的。
首先须要先登陆到Jcenter官网->Edit Profile->API Key:maven

而后打开local.properties放入,这个文件里面应该还有你的android sdk或ndk的路径配置:

sdk.dir=/Users/xxxx/Library/Android/sdk
BINTRAY_USER=xxxx
BINTRAY_KEY=xxxxxxx复制代码

上传

接下来就是重头戏了,上传的代码。这些代码须要写在你要上传的Module的build.gradle中,你能够就写在dependencies的底下。
首先须要引入两个插件(为了让看官们,理解应该写在哪,我在上面加入了dependencies部分,这个与上传无关):

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

}
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'复制代码

接下来是定义写基本信息:

apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

def libname = 'sina_full'//项目的名字 这个与以后生成的路径无关,单纯是在网站上的显示
def libdesc = '新浪完整版' //项目的名字 这个与以后生成的路径无关,单纯是在网站上的显示
version = rootProject.ext.version//版本号,这个咱们写在ext中了,没看到的朋友,往前看
group = rootProject.ext.group//这个就是路径名的group了复制代码

这里要特别注意group就是上传成功以后,依赖的group,具体能够参照下图:


而后就是声称对应的jar和javadoc(如下代码能够直接拷贝,前提是在Project的gradle中配置了ext):

//生成源文件
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))
    options.encoding "UTF-8"
    options.charSet 'UTF-8'
    options.author true
    options.version true
    failOnError false
}

//文档打包成jar
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
//拷贝javadoc文件
task copyDoc(type: Copy) {
    from "${buildDir}/docs/"
    into "docs"
}

//上传到jcenter所须要的源码文件
artifacts {
    archives javadocJar
    archives sourcesJar
}

// 配置maven库,生成POM.xml文件
install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging rootProject.ext.packaging
                name libname
                url siteUrl
                licenses {
                    license {
                        name libname
                        url rootProject.ext.siteUrl
                    }
                }
                developers {
                    developer {
                        id rootProject.ext.id
                        name rootProject.ext.name
                        email rootProject.ext.email
                    }
                }
                scm {
                    connection rootProject.ext.gitUrl
                    developerConnection rootProject.ext.gitUrl
                    url rootProject.ext.siteUrl
                }
            }
        }
    }
}复制代码

以上代码就是生成上传所须要的东西,接着就是上传了:

Properties properties = new Properties()//先要读取local.properties中的name和key
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("BINTRAY_USER")    //读取 local.properties 文件里面的 bintray.user
    key = properties.getProperty("BINTRAY_KEY")   //读取 local.properties 文件里面的 bintray.apikey
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = libname    //发布到JCenter上的项目名字,必须填写
        desc = libdesc    //项目描述
        websiteUrl = rootProject.ext.siteUrl
        vcsUrl = rootProject.ext.gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}复制代码

至此,一切配置都完成了,能够运行了。

运行

运行分红两步:

  • 生成POM文件
    Windows:gradlew install
    Mac:gradle install
  • 上传你的Library库到jcenter的maven库
    Windows:gradlew bintrayUpload
    Mac:gradle bintrayUpload

    上传完成

    上传完成以后并不能真的使用。
    登陆jcenter首页->点击下方maven便可进入到你上传的maven库列表界面

在maven库列表界面找你你刚才上传的maven库点进去便可看到相关的项目详情:


点开你上传的项目,找到Add to JCenter 按钮,点击:


而后会跳转到提交描述内容界面:


点击提交便可。
通常没有问题的话,次日便可使用。

上传遇到的坑

在这里,我会总结一下上传的时候可能遇到的坑,如下内容不必定是我遇到的,有部分摘自网络,方便你们查看:

  • 编码GBK的不可映射字符
    解决:
    task javadoc(type: Javadoc) {
            options.encoding "UTF-8"
            options.charSet 'UTF-8'
        }复制代码
  • gradle 权限不足,或找不到gradle
    解决:先source一下,或者检查环境变量
  • Lint found errors in the project; aborting build.
    解决:第一,根据提示修改代码中不规范的地方,第二,去掉lint
    android {
    lintOptions {
    abortOnError false
    }
    }复制代码
  • Javadoc generation failed. Generated Javadoc options file
    解决:第一,正常加入javadoc生成,第二,去掉javadoc检查:
    allprojects {
    repositories {
    jcenter()
    }
    tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    }
    }复制代码
  • Could not create version ‘0.1’: HTTP/1.1 401 Unauthorized [message:This resource requires authentication]
    解决:没有配置正确的API Key
  • 如何升级
    解决:若是你是跟着个人教程走的,只须要修改ext中的version版本号便可。

最后仍是推荐一下个人公众号,欢迎给我留言。
更多的开发知识,能够关注个人公众号:

相关文章
相关标签/搜索