发布android-library到jcenter并同步maven


前言

昨晚,xUtils4群的joker和我说,能不能把xUtils发布到maven仓库啊,每次都要下载,用AS的话,maven仓库的包一条命令就可以自动适配了,于是乎,我开始尝试做maven打包了。

找了很多资料。直接打包到maven仓库,好像步骤很复杂,讨论着发布到 jcenter 仓库吧,那我又会想,发布到 jcenter,一些老项目用 maven 仓库会不会找不到我们的包,接下来,就又考虑到更新到 jcenter 之后,同步到 maven 的事情。下面就记录一下,整个 xUtils 包发布的过程吧。

准备工作

构建项目

xUtils 项目是一个library+一个sample,为了能在下次作者更新的时候,同步更新代码并发布,我在 github 上 fork 了项目,并 clone 下来,然后按照 Android studio 的模式配置了 library、sample module,使其能够正确运行(尽量不修改原来目录结构与文件,提高后期合并代码成功率),整个修改完成,能够发布的代码在我的 github 中有。

申请账号

1、申请 maven 账号,创建JIRA 打开 https://issues.sonatype.org/ 注册Sonatype的JIRA账号,这个账号在后面配置maven server时需要使用。 打开Create a OSSRH ticke 创建一个JIRA ticket,你的一个项目对应着这里的一个JIRA ticket, 其中Summary可以填写项目名,Description填写项目介绍。 Group Id 非常重要,必须是你项目 pom.xml 中的 group id 的父级,做为你账号和该项目关联的标记。如我这次移植项目 pom.xml 中 group id 为 com.jiechic.library,为了今后我所有项目都可以发布,申请填写的Group Id 为 com.jiechic 其他按照提示填写即可。完成后大概2个工作日左右,该Issue会变为 resolved 状态表示可用。

2、获取 maven token 第一步状态变更成功后(等邮件,一般第二天),登陆 https://oss.sonatype.org (https://issues.sonatype.org/ 上的用户名和密码) 按照下图步骤找到 UserTokenUserPassword 记录下来

3、申请 jcenter 账号 打开 https://bintray.com/ 注册账号即可,注册登陆之后,到用户信息中获取apikey。

获取密钥

使用命令本地生成 GPG 钥匙对(Linux环境,自行脑补,没太多时间教环境)

gpg --gen-key

命令生成自己的public key,除了姓名、邮箱、备注外其他都可以使用默认配置,最后需要填写一个 passphase,注意它在后面 mvn release 签名时需要。这时候记下一个 gpg.passphase

public key生成结束后用

gpg --list-keys

命令查看key内容,如下:

jiechic@jiechic-ThinkPad-Edge-E430:~$ gpg --list-keys /home/jiechic/.gnupg/pubring.gpg -------------------------------- pub 2048R/F137757E 2015-04-04 uid jiechic <jiechic@jiechic.com> sub 2048R/E8A492FF 2015-04-04

其中 F137757E 为keyid,需要将他上报给服务器,命令如下:

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys F137757E

配置发布jcenter

打开 ./build.gradle 添加 buildscript 的 repositories

classpath 'com.github.dcendents:android-maven-plugin:1.2'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'

打开 ./library/build.gradle,最后一行添加

apply from: 'bintray.gradle'

新建 ./library/bintray.gradle,有关发布的操作都在这个文件夹内,内容如下:

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

group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

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
}

javadoc {
     options{
             encoding "UTF-8"
             charSet 'UTF-8'
             author true
             version true
             links "http://docs.oracle.com/javase/7/docs/api"
     }
 }
install {
    repositories.mavenInstaller {
    // This generates POM.xml with proper parameters
        pom.artifactId = PROJ_ARTIFACTID
        pom {
            project {
                description PROJ_DESCRIPTION
                packaging 'aar'
                name PROJ_NAME
                url PROJ_WEBSITEURL
                licenses {
                    license {
                        name LICENSE_NAME
                        url LICENSE_URL
                    }
                }
                developers {
                    developer {
                        id DEVELOPER_ID
                        name DEVELOPER_NAME
                        email DEVELOPER_EMAIL
                    }
                }
                scm {
                    connection PROJ_VCSURL
                    developerConnection PROJ_VCSURL
                    url PROJ_WEBSITEURL
                }
            }
        }
    }
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['published','archives']
    publish = true
    pkg {
        repo = "maven"
        name = PROJ_NAME
        desc = PROJ_DESCRIPTION
        websiteUrl = PROJ_WEBSITEURL
        issueTrackerUrl = PROJ_ISSUETRACKERURL
        vcsUrl = PROJ_VCSURL
        licenses = ["Apache-2.0"]
        publicDownloadNumbers = true
    }
}

添加文件 ./library/gradle.properties,内容如下

PROJ_GROUP=com.jiechic.library //artifactId_groud_id
PROJ_VERSION=2.6.14 //version
PROJ_NAME=xUtils //project name
PROJ_WEBSITEURL=https://github.com/wyouflf/xUtils //project website
PROJ_ISSUETRACKERURL=https://github.com/wyouflf/xUtils/issues //project issues url
PROJ_VCSURL=https://github.com/wyouflf/xUtils.git //project sourse url
PROJ_DESCRIPTION=Android Fast Development Framework //description
PROJ_ARTIFACTID=xUtils //maven_artifactId
LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'
DEVELOPER_ID=wyouflf
DEVELOPER_NAME=wyouflf
DEVELOPER_EMAIL=wyouflf@gmail.com

恩,你没看错,这里就是一些项目定义,一些定义在 bintray.gradle 文件中调用,这样只需要维护 gradle.properties 就可以了,上传都由上面的代码实现。

修改 ./local.properties (没有就创建,一般都会有) 底下添加 jcenter 账号和apikey:(apikey怎么拿?返回上面看去!这两个参数在 bintray.gradle 中被使用)

bintray.user=jiechic bintray.apikey=xxxxxxxxxxxxxxxxxxxxx

恩,这时候你就可以使用命令来打包上传你的应用了

./gradlew bintrayUpload

恩,可是接下来你会发现,上传到 jcenter 之后,会有奇怪的问题发生,pom 文件和 jar 文件不在同一个目录,类似下图,自行脑补文件夹替代。

什么情况?情况就是 pom 文件都是上传到 library 下,而其他文件上传到了 xUtils 下,这种情况,如果这种情况上 jcenter 提交收录到公共仓库中,肯定是不行的,找了好几个方法,终于解决了。

pom 的上传,根据 module 的 name 为目录,不是根据 project.archivesBaseName (请查看bintray.gradle 文件头部),那么,我重新定义一下 library 文件夹不就行了?

之前说了,为了代码合并,不能直接修改 library 文件夹为 xUtils,不然作者改源码我就没法合并代码了。那就用 gradle 动态改吧。

修改 ./settings.gradle ,添加以下内容

def submoduleProject = project(':library') submoduleProject.name = 'xUtils'

修改 sample 中的 library 依赖。

compile project(path:':library') 修改为 compile project(path:':xUtils')

好了,到 jcenter 后台删除原来的,重新上传包一下看看吧。

./gradlew clean bintrayUpload

查看无误之后,在 jcenter 的后台申请加入 jcenter 中心库(上传成功之后,只是入住了个人的jcenter maven仓库,要发布到 jcenter 仓库,需要到后台提交审核,这个网页操作,自己想办法拉)

配置发布jcenter后同步maven

jcenter 发布成功后,使用下面语句引入我维护的 xUtils 包了。

compile 'com.jiechic.library:xUtils:2.4.16'

但是,这时候,mavenCtral 中心库是没有这个包的,好吧,接下来修改点东西,让他支持同步到 maven 吧。

修改 ./library/bintray.gradle ,在 description PROJ_DESCRIPTION 之后添加以下内容:

dependencies {
    project.configurations.collectMany { it.allDependencies }
    .findAll { it instanceof ProjectDependency || it instanceof ExternalModuleDependency}
    .each {
        dep -> dependency {
        groupId dep.getGroup() artifactId dep.getName() version dep.getVersion() scope 'compile'
        }
    }
    //android dependency
    dependency { groupId 'com.google.android' artifactId 'com.google.android' version '2.2' scope 'provided' }
}

在 key = properties.getProperty(“bintray.apikey”) 之后添加一下内容:

def passphrase = properties.getProperty("gpg.passphrase")
def userToken = properties.getProperty("UserToken")
def userPassword = properties.getProperty("UserPassword")

在 pkg {} 的节点内最后添加一下内容:

version {
    gpg {
        sign = true //Determines whether to GPG sign the files. The default is false
        passphrase = 'passphrase' //Optional. The passphrase for GPG signing'
    }
    mavenCentralSync {
        sync = true //Optional (true by default). Determines whether to sync the version to Maven Central.
        user = userToken //OSS user token
        password = userPassword //OSS user password close = '1' //Optional property. By default the staging repository is closed and artifacts are released to Maven Central. You can optionally turn this behaviour off (by puting 0 as value) and release the version manually.
    }
}

接下来,修改 ./local.properties,maven 相关信息:

gpg.passphrase=xxxxxxxxx //申请GPGkey时输入的密码 UserToken=xxxxxxxxxxxxx //登陆maven后台查看的userToken UserPassword=xxxxxxxxxxxxx //登陆maven后台查看的userPassword

好了,这时候,可以修改一个版本号,重新上传试试,版本号在哪里改?在 ./library/gradle.properties 里面啊。

上传成功后,过十来分钟,maven 仓库同步完之后,也可以使用一下指令引入支持了。

compile 'com.jiechic.library:xUtils:2.4.16'

小结

大部分的配置信息都在 ./library/gradle.properties 里面, 小部分隐私配置(网站账号)在 ./local.properties 里面进行配置,这个文件是不上传源码管理的。 看了很多文章,解决了 library 改名而文件夹不改名的问题, 解决了同步到 maven 仓库缺少 dependency 的问题,其实我觉得,dependencies 里面递归那段也应该写到 jcenter 的 pom.xml 里,现在的最终结果也是写了的。

相关文章

http://www.trinea.cn/dev-tools/upload-java-jar-or-android-aar-to-maven-center-repository/ http://blog.csdn.net/maosidiaoxian/article/details/43148643 http://www.cnblogs.com/qianxudetianxia/p/4322331.html https://github.com/dcendents/android-maven-plugin/issues/9

声明:Jiechic's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 发布android-library到jcenter并同步maven


Just Jiechic's Blog