新版Bintray下将Android Library 开源到JCenter 的正确姿势

96
木木仨儿
2017.03.30 11:32* 字数 1419

前记

对于经历过Eclipse开发时代的人来说,如今在Android Studio中通过 compile 命令来添加外部库引用简直爽的不要不要的,在使用github上数以千计的开源库时,最常用方式就是:compile 'com.android.support:recyclerview-v7:23.4.0',那么如何让自己写的库也能通过这样的方式引用呢?

其实就是将自己写好的库打包发布到JCenter即可,本来看着非常简单,但是实际做起来每一步都有很多坑等着你去踩。经历过从入门到失败到放弃到成功的过程后,现在将一步步的过程和雷区记录下来,希望能帮助别人越过深坑直达彼岸~~~

准备工作

准备一个库

新建Module,选择Library

Android Studio建库
Android Studio建库

注册谷歌邮箱账号

我知道你不想翻墙,但你迟早需要这个账号的,早准备早升天。

注册Bintray账号

最终需要通过这个账号发布到JCenter上。注册地址官网:https://bintray.com/,这里就有一个坑,现在这个地址默认是注册组织的,注册后会有一个月试用期。

组织账号有试用期
组织账号有试用期

我们一般需要的是个人类型,正确的注册地址为:

https://bintray.com/signup/oss

个人注册地址
个人注册地址

这里是没有填写组织名称的。可以使用第三方注册,常用的就是 github账号,需要注意:如果github账号绑定的邮箱不是gmail邮箱,Bintray无法注册成功。所以这个时候你需要完成第一步然后通过gmail邮箱完成注册。

正式开始起飞

创建组织

使用注册账号登录后,点击 Add New Organization

创建组织-1
创建组织-1

接着下一步

创建组织-2
创建组织-2

接着下一步

创建组织-3
创建组织-3

最后点击create完成创建。

创建仓库

点击 Add New Repository 创建仓库

创建仓库-1
创建仓库-1
创建仓库-2
创建仓库-2

创建成功后,在刚才的界面 Add New Repository 下面可以看到创建的仓库。点击进去查看详细信息,此时里面是空的。

在Android Studio 中添加配置

主要涉及到的配置文件有三个:

此处输入图片的描述
此处输入图片的描述
  • 第一个:工程项目(project)的 build.gradle文件
  • 第二个:模块库(module) 的 build.gradle文件
  • 第三个:工程项目的 local.properties文件

配置第一个

在你Project的build.gradle文件中加入Maven和Jfrog Bintray的依赖插件:

 classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
 classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
添加插件
添加插件

配置第二个

第二项配置较多,可以参考下面完整的进行补充:

P.S. 有注释的是需要替换自己的参数,其他复制即可

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

def siteUrl = 'https://github.com/leonHua/LFilePicker'   // 项目的主页
def gitUrl = 'https://github.com/leonHua/LFilePicker.git'   // Git仓库的url
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

version = "1.0" //发布版本号
group = "com.leon" //最终引用形式,如compile 'com.leon.lfilepicker:1.0.0',其中lfilepicker在后面配置
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile 'com.android.support:recyclerview-v7:25.0.0'
}
bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    pkg {
        repo = 'leonlibrary'//自己创建的仓库名字
        name = 'lfilepicker'//上传到JCenter的名字,最终引用的名字
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ['MIT']//不能随便写,只能是仓库创建时选择的license type
        userOrg = 'mumusalibrary' //自己创建的organization名称
        publish = true // 是否是公开项目,公开别人可以引用

        version {
            name = '1.0'
            desc = 'leon open library.'//描述,自己定义
            released  = new Date()
            vcsTag = 'v1.0'
            attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']
        }
    }
    configurations = ['archives']
}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                // Add your description here
                name 'Leon Android'
                description 'leon open library.'
                url siteUrl
                // Set your license
                licenses {
                    license {
                        name 'MIT' //和之前自己定义的协议一致
                        url 'https://raw.githubusercontent.com/minggo620/Pluto-Android/master/LICENSE'
                    }
                }
                developers {
                    developer {
                        id 'leonhua2017'        //填写bintray或者github的用户名
                        name 'leonhua2017'         //姓名
                        email 'leon.gitlibrary@gmail.com'//邮箱
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}
task javadoc(type: Javadoc) {
    failOnError false //必须添加以免出错
    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
}

javadoc {
    options{
        //如果你的项目里面有中文注释的话,必须将格式设置为UTF-8,不然会出现乱码
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
    }
}

以上添加成功后,点击编译下项目,会下载一些插件东西,成功后继续。

配置第三个

在local.properties中添加账户名称和apikey信息

添加账户和apikey
添加账户和apikey

apikey信息可以通过以下方式获得:

获取apikey
获取apikey

执行命令

在Android Studio中的Terminal窗口中输入命令:gradlew -v
正常的话会显示版本信息,如果还没有安装的话会自动安装,安装后也会显示版本信息。

然后在输入命令:gradlew install
此时也会显示下载安装一些东西,耐心等待即可,完成后显示“BUILD SUCCESSFUL”即表示成功。

install 成功
install 成功

最后上传,在Terminal窗口输入命令:gradle bintrayUpload
然后等待上传,显示“BUILD SUCCESSFUL”即表示成功。

upload 成功
upload 成功

发布

回到仓库页面可以看到刚才上传的项目:

发布成功
发布成功

点击项目后进入详细界面,这个时候点击界面右下角的add to JCenter,然后输入描述发送即可。
然后等待审核,我这个比较快,10分钟就通过。

遇到的坑

1:官网地址

前面已经说过,注册地址一定要选对

2:Unsupported major.minor version 52.0

首先检查JDK版本问题,需要更换到JDK8,环境变量配置后一定记得需要在Android Studio中配置

JDK配置
JDK配置

如果JDK没问题,还有可能是Studio里各项配置的版本问题,查了很多资料,总的来说就是当前环境的整体配置版本(以下三项)要一致:

  • compileSdkVersion
  • buildToolsVersio
  • gradle

3: HTTP/1.1 401 Unauthorized

这个一般是因为账号和apikey信息错误,仔细检查local.properties文件中的配置是否正确

4: gradlew 不是内部或外部命令

配置gradle的环境变量,和配置JDK类似,如果配置过后还不行,所有的命令更换为 gradle 也可以。

5: 路径问题

如果环境中除了需要打包的库还有其他模块,那么在命令行窗口中需要先切换到对应的目录环境下再执行命令。

路径
路径

End

弄到这里终于算是成功了。发布到JCenter有很多种方式,这里只是用了其中的一种,自己做的时候也参考了很多文章,有一些时间早点的文章会出现很多莫名其妙的问题。可能别人成功实现的方法,自己在做的过程中还是会发生很多原文章中没有提(遇)到的问题。希望自己的总结可以帮到后来者,同时不可避免的还会有一些文中没有的问题出现,欢迎留言交流。

欢迎访问博客: https://leonhua.github.io/ ,查看更多文章。

Android
Web note ad 1