My Avatar

Kejin

自己选的路,跪着也走下去!

Android Studio 发布Java项目到Maven/JCenter仓库

2016年03月27日 星期天, 发表于 上海

如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)

为了方便自己和他人引用我所写的java库,发布到 Maven/JCenter 上是最好不过了,利己利人,本文主要参考了

使用Gradle发布项目到JCenter仓库

Git项目: Gradle Publish

虽然这篇已经很详细的,但是我在实际操作中还是碰到了一些问题,所以自己再整理一遍,方便以后查阅

前言(MavenCentral和JCenter的区别)

第一步

[注意:你的工程必须为 library, 即:”apply plugin: ‘com.android.library’”, 否则后面的 bintray.gradle 会 build 失败]

第一步当然是注册 bintray 的账号, 得到 user 和 apiKey, apiKey 在你的 profile 里面,编辑你的 Profile,就能看到 API Key, 把你的 user 和 apiKey, 写入到工程目录下的 local.properties 文件中

project/
    \_ local.properties

写入

bintray.user=XXX
bintray.apikey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

因为 apiKey 是一个非常隐私的东西,所以写在 local.properties 文件里面,避免和工程一起上传到VCS中, 因为一般 local.properties 文件是被写在 .gitignore 里面的,不过如果使用其他的 VCS, 要注意隐藏这个文件

第二步

在你的 Module 目录下新建一个 bintray.gradle

project/
    \_ module/
        \_ bintray.gradle

然后在这个 Module 的 build.gradle 里面追加下面代码

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
    }
}

apply from: 'bintray.gradle'

第三步

将以下代码写入到 bintray.gradle 文件中

group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

apply plugin: 'com.jfrog.bintray'
apply plugin: "com.jfrog.artifactory"
apply plugin: 'maven-publish'

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += configurations.compile
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

javadoc {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
        title "$PROJ_NAME $PROJ_VERSION"
    }
}


def pomConfig = {
    licenses {
        license {
            name "The Apache Software License, Version 2.0"
            url "http://www.apache.org/licenses/LICENSE-2.0.txt"
            distribution "repo"
        }
    }
    developers {
        developer {
            id DEVELOPER_ID
            name DEVELOPER_NAME
            email DEVELOPER_EMAIL
        }
    }
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            artifact javadocJar
            artifact sourcesJar

            pom.withXml {
                def root = asNode()
                root.appendNode('description', PROJ_DESCRIPTION)
                root.children().last() + pomConfig

                def dependenciesNode = root.appendNode('dependencies')
                configurations.compile.allDependencies.each {
                    if (it.group && it.name && it.version) {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }
                }
            }
        }
    }
}

afterEvaluate {
    publishing.publications.mavenJava.artifact(bundleRelease)
}

bintray {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")

    publications = ['mavenJava']
    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
    }
}

artifactory {
    contextUrl = 'http://oss.jfrog.org/artifactory'
    resolve {
        repository {
            repoKey = 'libs-release'
        }
    }
    publish {
        repository {
            repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
            username = bintray.user
            password = bintray.key
            maven = true
        }
        defaults {
            //这里的名字和上面红色的名字一致即可,会将其包含的输出上传到jfrog上去
            publications('mavenJava')
            publishArtifacts = true
        }
    }
}

第四步

配置 gradle.properties 文件, 这个文件再工程根目录下

project/
    \_ gradle.properties

写入

# 库的包名
PROJ_GROUP=cn.kejin.android.views
# 库的ID
PROJ_ARTIFACTID=XImageView
# 库的版本
PROJ_VERSION=1.0.0
### 最后 gradle引用的形式就是 $PROJ_GROUP:$PROJ_ARTIFACTID:$PROJ_VERSION

# 库名
PROJ_NAME=XImageView
# 库的项目主页
PROJ_WEBSITEURL=https://github.com/liungkejin/XImageView
# 问题跟踪地址
PROJ_ISSUETRACKERURL=https://github.com/liungkejin/XImageView/issues
# VCS 地址
PROJ_VCSURL=https://github.com/liungkejin/XImageView.git
# 库的简单描述
PROJ_DESCRIPTION=Android View for show large image

# 开发者的信息, 可以随意
DEVELOPER_ID=Kejin
DEVELOPER_NAME=Liang Ke Jin
DEVELOPER_EMAIL=liungkejin

第五步

运行发布,在我参考的文章中,是直接运行

gradle bintrayUpload # 发布到bintray.com
gradle artifactoryPublish  # 发布到oss.ifrog.org

但是这样做是很容易出错的,因为如果 javadoc 或者 javadocJar 等任务没有运行成功, 他会跳过,最后还是会将最后的 aar 发布上去。

所以我觉得,先单独运行各个子任务,都 Build 成功后,再来进行 publish和Upload

运行子任务可以使用 Android Studio 右边的 gradle 面板,如果什么都没有,可以点击面板上面的刷新按钮,出来后, 进入到你的库模块,找到这个几个子任务,双击执行

子任务有:

最后

当成功上传到 bintray 上后, 可以进入到你的首页, 可以在左下角看到 My Recent Package 下面有你刚上传的库 点击进入,然后点击右下方有一个 Add to JCenter 按钮, 填写 comments (不写也可以),点击 Send, 然后等待审核通过,

最后,通过之后,就可以方便的使用这种方式来引用你的库了

compile 'cn.kejin.android.views:XImageView:1.0.0'