将自己写的库发布到Jcenter

将自己写的库发布到Jcenter

下载最新build.gradle配置文件,然后配置local.properties文件就可以了

正文开始

做这个工作会遇到很多问题,各种各样,推荐这篇文章

0.错误

0.0 - 在这里会遇到很多问题,我说一下我遇到的问题吧,可以先不看,如果你没有遇到这样的问题。

0.1- gradle.properties里面会有systemProp.http.proxyHost=127.0.0.1 systemProp.http.proxyPort=1080这样的字段,不知道为什么这个不删掉的话build会出问题,所以如果出了问题吧这个删掉试试

0.2- 打包javadoc时会出问题,因为他会将你所有的注释打包进去,如果注释写的不规范就会报错,不过这个是有提示的,按照提示改掉就好了,注释要符合要求。

0.3 - 如果出现了gradle commond not found,说明你的gradle路径没有配置,mac可以参考这篇文章,windows的话自己查一下如何配置

0.4- 你的library中的manifest文件有allowback属性最好删掉,如果使用你库的人的属性和你不一致,就会报错,作为一个library完全可以把application部分删掉

0.5- 不能打包三方库,比如android的v7,AppCompatActivty,RecyclerView是无法打包的,下面我给出了解决办法。

0.6 - resourcePrefix “cc_”这个命令,使用了它,你的所有资源都需要强制带前缀,比如cc_layout.xml,cc_attr_xx.xml类似这样的,这是对你库资源文件的一种区分,好像可以不带,我暂时没有试过,网上有的版本是不带的。

1.介绍

1.1我们使用gradle开发,可以通过compile命令将别人的library下载到本地使用,非常方便,其实我们自己写的library也同样可以使用这种方法

1.2我们之所以可以使用别人的library,是因为别人将自己的library发布到了JCenter,我们可以通过compile命令将aar文件文档等内容下载下来使用,也就是说只要我们将自己的library发布到JCenter,那么自己和别人就都可以使用了

网上有很多资料,介绍了各家各户的服务器,balabala,但是JCenter目前是library最多的服务器,所以现在gradle默认都是repositories {jcenter()}但是看着容易做着难,走了很多弯路,现在把我的经验分享出来,希望可以帮到别人。

2.注册账号

2.1 我们要发布自己的库到JCenter,首先要将代码发布到maven库,官方网站www.bintray.com,这个没什么好说的,我是用github授权登录的,下载之后真正有用的是你的用户名和apikey.获取方法 -》 右上角点击头像 -》your profile -》头像下面edit -》 最下面的APIkey 就可以获取了,后面有用.

3.构建项目

3.1 通常你的项目应该有app + library两部分,因为我们要发布到maven 的是你的library,所以这个moudle需要有,(假如你不明白什么意思,看这里,点击file - > new moudle -> library,就可以建立一个library moudle)。然后你应该把这个项目发布到github上去,后续需要填写项目的地址,当然这不是必选的。

4.配置(重要)

4.1 核心就在于需要配置的信息,我现在的项目是QuickAdapter,库的名称叫adapterlibs,我以此为例广告别点

4.2 首先是QuickAdapter.gradle

//最后写完应该是这样的
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        //主要是下面的两行
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

4.3 配置local.properties

//注意,你千万不要将这个文件上传到git,携带隐私信息的
bintray.user=用户名
bintray.apikey=apikey

4.4 然后进入你的moudle,很多操作都是针对moudle来做的,编写adapterlibs.gradle下面的三部分

//在首部添加,是用上传插件,比较重要的是version,他代表你的库的版本,你下次更新时将版本号增加就可以了
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
version = "1.0.2"
//android{}通常是接着的一部分,这部分没什么变化,但是需要注意的是你的compileSdkVersion如果是23,那么如果使用你的库的人版本是22,他编译会出问题,所以尽可能小一点,不要版本太高了,别人用不了,targetSdkVersion 小一点
android {
     //随便写点什么,没有的话不知道碍不碍事,不重要,是资源的前缀符号(自定义控件xml属性时有用)
    resourcePrefix "cc_"

    compileSdkVersion 22
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 15
        versionCode 1
        versionName "1.0"
    }
}
//这个是原始的版本,但是有个问题就是不能打包第三方库,比如android的v7包和其他一些三方,也是网上说的比较多的方法,了解一下,可以不看,在这部分下面是替代的最新方法
//这部分是重点,下面将会使用这些宏,你做的就是需要将下面的信息替换成你自己的
def siteUrl = 'https://github.com/chendongMarch/QuickAdapter'   // 项目的主页
def gitUrl = '[email protected]:chendongMarch/QuickAdapter.git'   // Git仓库的url
def proName = 'QuickAdapter'  //项目的名称,将会显示在bintray
def proDesc = 'quick adapter' //项目的描述,不会有什么影响,随便写点
def yourId = 'chendongmarch'  //bintrayID
def yourName = 'chendong'  //不重要,你自己的nickname就可以
def yourEmail = '[email protected]'  //email


group = "com.march.adapterlibs"            // Maven Group ID for the artifact,一般填你唯一的包名

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'

                // Add your description here
                name proDesc
                url siteUrl

                // Set your license
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id yourId
                        name yourName
                        email yourEmail
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl

                }
            }
        }
    }
}

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
}

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 = "maven"
        name = proName    //发布到JCenter上的项目名字
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

下载build.gradle配置文件

//下面的版本可以打包三方库
def siteUrl = 'https://github.com/chendongMarch/QuickAdapter'   // 项目的主页
def gitUrl = '[email protected]:chendongMarch/QuickAdapter.git'   // Git仓库的url
def proName = 'QuickAdapter'  //项目的名称,将会显示在bintray
def proDesc = 'quick adapter' //项目的描述,不会有什么影响,随便写点
def yourId = 'chendongmarch'  //bintrayID
def yourName = 'chendong'  //不重要,你自己的nickname就可以
def yourEmail = '[email protected]'  //email

group = "com.march.adapterlibs"            // Maven Group ID for the artifact,一般填你唯一的包名

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters一
        pom {
            project {
                packaging 'aar'

                // Add your description here
                name proDesc
                url siteUrl

                // Set your license
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id yourId
                        name yourName
                        email yourEmail
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl

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

artifacts {
    archives sourcesJar
}

android.libraryVariants.all { variant ->
    println variant.javaCompile.classpath.files
    if(variant.name == 'release') { //我们只需 release 的 javadoc
        task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
            source = variant.javaCompile.source
            classpath = files(variant.javaCompile.classpath.files, project.android.getBootClasspath())
            options {
                encoding "utf-8"
                links "http://docs.oracle.com/javase/7/docs/api/"
                linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
            }
            exclude '**/BuildConfig.java'
            exclude '**/R.java'
        }
        task("javadoc${variant.name.capitalize()}Jar", type: Jar, dependsOn: "generate${variant.name.capitalize()}Javadoc") {
            classifier = 'javadoc'
            from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
        }
        artifacts {
            archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
        }
    }
}
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 = "maven"
        name = proName    //发布到JCenter上的项目名字
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

5.运行

打开terminal,运行./gradlew bintrayUpload就可以开始上传了。

6.去网站查看

进入你的bintray,打开所在的项目,注意右上角有个链接,类似(https://dl.bintray.com/chendongmarch/maven),这是你maven库的链接。注意左下角有三个很小的选项maven,gradle.lvy,点击gradle可以看到类似这样的(compile ‘com.march.adapterlibs:adapterlibs:1.0.2’),这是compile的地址

7.使用maven库,在发布到JCenter之前可以使用下面的方法,立刻就可以体验

//在项目名称.gradle文件中添加你bintray的链接
allprojects {
    repositories {
        jcenter()
        maven {url 'https://dl.bintray.com/chendongmarch/maven'}
    }
}
//在app.gradle文件中添加
compile 'com.march.adapterlibs:adapterlibs:1.0.2'

8.发布到JCenter

在网站打开你的项目右下角可以看到Add to jcenter点击之后可以很简单的添加你的库到JCenter,但是审核需要时间,慢慢等吧。等到审核通过,就可以将maven{url=”“}这一块去掉,直接compile

9.可以试试我的库,是OK的

10.发布本地库

不用上传到 jcenter 单单运行 ./gradlew install 任务, gradle 会在 maven 的本地仓库中生成工件(artifact),只需将 mavenLocal 添加到 repositories,我们可以像发布到 JCenter 一样引用自己的库,方便打包那些多个项目共享又不想发布的私有库, 在项目名称.gradle文件添加下面的依赖,可以使用本地库

allprojects {
    repositories {
        mavenLocal()
        jcenter()
    }
}

你可能感兴趣的:(android,gradle,library,库,Jcenter)