将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插件
将Gradle项目发布到Jcenter和Maven Central的更多相关文章
- 如何通过Android Studio发布library到jCenter和Maven Central
http://www.jianshu.com/p/3c63ae866e52# 在Android Studio里,如果你想引入任何library到自己的项目中,只需要很简单的在module的build. ...
- 如何把开源项目发布到Jcenter
转载自:https://www.jianshu.com/p/f66972f0607a 首先我们应该注册一个JFrog Bintray的账号 Jfrog Bintray官网 这里我们可以注意到那个绿色的 ...
- Android Library项目发布到JCenter最简单的配置方法
前沿 网上的步骤看起来实在太麻烦,gituhb上偶然间看到的一个项目,经过实际验证确实可行.github连接:https://github.com/xiaopansky/android-library ...
- 如何使Android Studio项目发布到Jcenter中
Android仓库 简单的普及下关于android的依赖仓库,有两种分别是Jcenter与Maven Central其实不管是Jcenter还是Maven Central都是Maven库. Jcent ...
- 【转】如何使用Android Studio把自己的Android library分发到jCenter和Maven Central
转自:http://www.devtf.cn/?p=760&utm_source=tuicool 如何使用Android Studio把自己的Android library分发到jCenter ...
- How to distribute your own Android library through jCenter and Maven Central from Android Studio
In Android Studio, if you wish to include any library to your application. You could just simply add ...
- 将Gradle项目发布到Maven Central库中
本文主要介绍如何一个由gradle构建的项目部署到Maven Central. 网上大部分都是介绍如何将由maven构建的项目部署到Maven Central.与Gradle相关的比较少. 申请账号 ...
- AndroidStudio怎么将开源项目发布到jcenter
前言 自己在网上搜了一大堆,大体就两种方法,而我选择的是其中代码少的的方法,不过他们或多或少留下了少许的坑,(按他们的方法我是上传成功,但不能发布到jCenter上去,也可能是我自己的问题o(≧v≦) ...
- [转]:如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html
随机推荐
- requests之一:HTTP OAUTH认证(1)图形解释流程
- ES6 new syntax of Rest and Spread Operators
Rest and Spread Operators.md Why we need rest and spread operators? var showCollections = function(i ...
- webpack构建react项目(一)
前言 下面是我们使用到技术栈: webpack + react + redux + react-router + react-thunk + ES6 + .... 注意事项: 建议使用npm5.X 或 ...
- [Luogu 3835]【模板】可持久化平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作 ...
- [SDOI2008]Sue的小球
题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一 ...
- ●BZOJ 4176 Lucas的数论
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4176 题解: 莫比乌斯反演,杜教筛 首先有这么一个结论: 令d(n)表示n的约数的个数(就是 ...
- POJ2135:Farm Tour
题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路 题解:可以定义一个源点s,和一个汇点t s和1相连容量为2,费用为0, t和n相连容量为2,费用为0 然后所用的边的容量都定为 ...
- ●BZOJ 2560 串珠子
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2560 题解: 容斥,状压计数dp 首先求出一个数组 g[s] 表示集合内的点的连边方案数(两 ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 5480(前缀和)
题意:如果一个点,则这点的横竖皆被占领,询问矩阵是否全被占领. 思路:将被占领的x,y标记为1,用x表示1 - i的和 如果x轴的差为 x2 - x1 + 1则表示全被占领,y轴同理 #include ...