将Gradle项目发布到Jcenter和Maven Central

Jcenter和Maven Central

为了方便我们理解Android studio是如何帮助我们获取开源库的,我们需要理清几个概念。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jcenter 和 Maven Central。

jcenter

jcenter是一个由 bintray.com维护的Maven仓库 。你可以在这里看到整个仓库的内容。
我们在项目的build.gradle 文件中如下定义仓库:

allprojects {
    repositories {
        jcenter()
    }
}

Maven Central

Maven Central 则是由sonatype.org维护的Maven仓库。
如我们使用Maven Central:

allprojects {
    repositories {
        mavenCentral()
    }
}

注:不管是jcenter还是Maven Central ,两者都是Maven仓库。虽然jcenter和Maven Central 都是标准的 android library仓库,但是它们维护在完全不同的服务器上,由不同的人提供内容,两者之间毫无关系。

其他

除了两个标准的服务器之外,如果我们使用的library的作者是把该library放在自己的服务器上,我们还可以自己定义特有的Maven仓库服务器。Twitter的Fabric.io 就是这种情况,它们在https://maven.fabric.io/public上维护了一个自己的Maven仓库。如果你想使用Fabric.io的library,你必须自己如下定义仓库的url。

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

然后在里面使用相同的方法获取一个library。

dependencies {
    compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
}

为什么要使用两个不同的标准仓库

起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。
但是Maven Central的最大问题是对开发者不够友好。上传library异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。
有许多将Maven Central替换成jcenter的理由,下面是几个主要的原因。

  • jcenter通过CDN发送library,开发者可以享受到更快的下载体验。
  • jcenter是全世界最大的Java仓库,因此在Maven Central
    上有的,在jcenter上也极有可能有。换句话说jcenter是Maven Central的超集。
  • 上传library到仓库很简单,不需要像在 Maven Central上做很多复杂的事情
  • 友好的用户界面

Gradle

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置。
 很明显,Gradle的出现是为了弥补ant和maven构建方式的不足,它不是采用传统的xml文件构建方式,而是采用groovy方式来构建。具体映射到android中就是使用gradle脚本文件的构建方式。它贯穿了项目的整个生命周期,包括编译、检查、测试、打包、部署。

 因此,google将gradle方式作为了android项目管理的默认方式,使用android studio创建的项目下面会默认生成build.gradle文件作为默认构建。
更多的android Gradle介绍请看:
- gradle-android
- wikipedia-gradle介绍

常见的Maven仓库和Gradle依赖的使用

在使用ant构建项目的时候我们要使用第三方库往往要下载对应的库并将其jar文件拷贝到项目文件夹下面,这样会显得很麻烦。在使用gradle构建方式以后我们只要需要一个坐标就能够引入项目库文件,例如:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
}

所谓的gradle依赖就是我们提供一个坐标然后它会自动帮我们从网络上下载对应的文件,甚至我们可以在本地看到库文件的源码。
那我们到底是从哪里下载到对应的文件呢?我们通过跟踪项目文件顶级目录下面的buidle gradle文件:

allprojects {
    repositories {
        jcenter()
    }
}

然后查看Jcenter的函数文件

 /**
     * Adds a repository which looks in Bintray's JCenter repository for dependencies.
     * <p>
     * The URL used to access this repository is {@literal "https://jcenter.bintray.com/"}.
     * The behavior of this repository is otherwise the same as those added by {@link #maven(org.gradle.api.Action)}.
     * <p>
     * Examples:
     * <pre autoTested="">
     * repositories {
     *     jcenter()
     * }
     * </pre>
     *
     * @return the added resolver
     * @see #jcenter(Action)
     */
    MavenArtifactRepository jcenter();

最终文件指向了Maven仓库。我们打开jcenter库
这里写图片描述
看到了我们常见的一些库,这样我终于搞清楚gradle依赖是从哪里来的了。
 事实上,这个Jcenter库是一家叫做bintray的机构维护,它作为google android官方默认的中央库.但在android studio的早期版本中默认使用的是maven库,它是由sonatype机构维护的。目前主要存在的三个依赖库为。

库名维护机构android studio调用
jcenter bintray jcenter()
maven sonatype mavenCentral()
lvy sonatype一般在ant中使用

上传函数库到Maven Central

今天我们来实践下如何将函数库发布到Maven Central上。

注册bintray帐号

为了让自己的项目也能够被全世界的开发者使用,我们可以通过将lib项目发布到jcenter库中,在配置脚本之前我们需要先去官网注册一个帐号,传送门:bintray 也可以使用第三方登录的方式来登录,包括github、google、facebook帐号等。注册成功后我们先要获取到一个api key。
这里写图片描述

上传文件

在Jcenter库中要求上传到库中的项目必须包含4个文件:

  • javadoc.jar
  • sources.jar 
  • aar或者jar
  • pom

如果少了审核可能不会通过,当然这几个文件都可一通过配置gradle脚本来自动生成。

配置Gradle脚本

为了创建上面所说的几个文件,我们需要构建脚本来自动生成对应的文件。可以参考:github-SwipeView-build.gradle

配置项目依赖

在buide.gradle增加依赖:

dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

注意: classpath ‘com.android.tools.build:gradle:1.0.0’ 在默认生成的文件下可能版本不一致,采用默认的有时候会导致构建失败,最好也修改成1.0.0版本的。

增加gradle插件和版本号

在需要上传的library项目的build.gradle下增加插件引用和版本号:

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
version = "1.0"

pom节点生成

 生成POM文件build脚本,可以参照下面的脚本:

def siteUrl = 'https://github.com/xiangzhihong/SwipeView'      // 项目的主页
def gitUrl ='https://github.com/xiangzhihong/SwipeView.git'   // Git仓库的url
group = "akiyama.swipe"
// 根节点添加
install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'swipeView For Android'
                url siteUrl
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'akiyama'
                        name 'daliyan'
                        email 'dali_yan@yeah.net'
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

注意:group = “akiyama.swipe”作为项目坐标的前缀,packaging ‘aar’ 为arr包,其它的自己随意填写。

javadoc和sources文件的生成

添加生成任务

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
}

注意:在构建生成的时候有可能会报GBK编码等错误,可能需要添加UTF-8声明,如下:

//添加UTF-8编码否则注释可能JAVADOC文档可能生成不了
javadoc {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
        title "swipeJavaDoc"
    }
}

构建上传jecnter库中脚本

 使用前面的我们注册帐号和apikey上传对应的文件到jcenter库中:

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 = "swipeView"                // project name in jcenter
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

因为用户名和apikey是属于个人的隐私信息,故在local.properties(该文件不会上传到Git库中)本地文件中配置用户名和apikey。

sdk.dir=/home/android-sdk
bintray.user=your username
bintray.apikey=your apikey

上传和审核

在配置好了上述build.gradle文件后我们打开gradle控制面板就能看到如图所示的构建任务。
这里写图片描述
双击bintrayUpload就能自动上传到jcenter库中了,然后静等审核成功。
然后成功后可以通过http://jcenter.bintray.com/ 查询到你的库文件。

同步项目到mvnrepository

在jcenter中提供了将项目同步到mvnrepository库中,这样就不需要操作上传到mvnrepository库的繁琐步骤。在bintray构建脚本最后加上:

/Optional configuration for Maven Central sync of the version
            mavenCentralSync {
                sync = true //Optional (true by default). Determines whether to sync the version to Maven Central.
                user = 'userToken' //OSS user token
                password = 'paasword' //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.
            } 

注意:user和password即为mvnrepository中注册的用户名和密码。如果同步成功你也可以通过http://mvnrepository.com/ 查询到你上传的lib项目。
至此使用gradle将lib库上传到Maven Central中央库的介绍就完了,还不赶快试试。
友情链接:自建插件库
自己动手实现Android插件

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Android Gradle 构建系统中,`allprojects` 是一个用于配置所有项目Project)的块。它可以用于在根目录的 build.gradle 文件中配置一些适用于所有项目的设置,例如仓库地址、构建脚本的共享逻辑等。 `allprojects` 块可以用来配置所有的项目,包括根项目和子项目。以下是一个示例: ```groovy allprojects { repositories { google() // Google Maven 仓库 jcenter() // JCenter 仓库 } } ``` 在这个示例中,我们使用 `allprojects` 块来配置所有项目的仓库。`repositories` 块用于指定项目所使用的仓库地址,这里我们添加了 Google Maven 仓库和 JCenter 仓库。 通过这种方式,在所有项目中都可以共享相同的仓库配置,不需要在每个项目的 build.gradle 文件中重复配置。 除了仓库配置,`allprojects` 块还可以用于配置其他适用于所有项目的设置,例如构建脚本的共享逻辑、插件的配置等。可以根据具体需求在 `allprojects` 块中进行相应的配置。 需要注意的是,`allprojects` 块中的配置会被所有项目继承,并且根项目中的 `allprojects` 块会被子项目继承。如果需要对子项目进行特定的配置,可以在子项目的 build.gradle 文件中进行覆盖或添加额外的配置。 总结来说,`allprojects` 块可以用于在 Android Gradle 构建系统中配置适用于所有项目的设置,例如仓库地址、构建脚本的共享逻辑等。通过使用 `allprojects` 块,可以减少重复配置,提高项目的维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangzhihong8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值