2019 Android library 怎么快速上传 Jcenter

Library 的两种结构

当我们写下自己的组件库时,结构可能如下面两种方式:

_

当我们的库比较简单时采用第一种方式就足够了,但是当库比较复杂时,第二种拆分为多个组件的方式能够跟好的组织与提供服务。下面会介绍这两种结构的项目如何快速上传 Jcenter。

注册 Bintray

第一步首先是注册 Bintray Open Source 账户,注册地址是 Create Your JFrog Bintray Account https://bintray.com/signup/oss, 请注意不要去 Bintray 主页注册为企业账户,否则删除账户需要在 3 个月后试用时长过期后才可以申请。

注册页面预览:

_

建立 Maven 仓库

账号建立并成功登录之后,你们看到的页面可能和下图类似:

_

不同之处可能是 Owned Repositories 部分是空的。 接下来就是建立自己的 maven 仓库了。 点击 Owned Repositories 区域的 Add New Repository, 重点在于 Type 需要选择 Maven 项,其他部分根据自己的实际情况填写。

screencapture-bintray-swordsoul-2019-10-15-17_18_24.png

当创建成功之后,回自动进入的新的仓库页面,预览如下:

screencapture-bintray-beta-2019-10-15-17_24_04.png

对单 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 按钮,最后等待删除成功提示即可。