全称为Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。
在发布maven之前,android普遍使用ant的方式进行项目的构建和管理,它们均使用XML文件来配置描述项目的,相比较于ant maven提供的功能更加强大。主要表现在以下几点:
- 使用POM的方式来管理和描述项目
- 内置了更多的隐式规则,使得构建文件更简单
- 内置了软件构建的生命周期
- 内置了依赖管理来和Repository来实现依赖管理
然而在一些中大型项目中使用Maven方式构建软件会让XML配置文件越来越大,越来越笨重,而且灵活性不够,因此,出现了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介绍
- ant\maven\gradle比较
在使用ant构建项目的时候我们要使用第三方库往往要下载对应的库并将其jar文件拷贝到项目文件夹下面,这样会显得很麻烦。在使用gradle构建方式以后我们只要需要一个坐标就能够引入项目库文件,例如:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
}
这个就是gradle依赖使用方式。所谓的gradle依赖就是我们提供一个坐标然后它会自动帮我们从网络上下载对应的文件,甚至我们可以在本地看到库文件的源码。
那我们到底是从哪里下载到对应的文件呢?我们通过跟踪项目文件顶级目录下面的buidle gradle文件:
allprojects {
repositories {
jcenter()
}
}
jcenter函数:
/**
* Adds a repository which looks in Bintray's JCenter repository for dependencies.
*
* 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)}.
*
* Examples:
*
* repositories {
* jcenter()
* }
*
*
* @return the added resolver
* @see #jcenter(Action)
*/
MavenArtifactRepository jcenter();
我们知道我们的包是从一个叫做Bintray’s JCenter repository中下载而来的,我们打开jcenter库试试,
看到了我们常见的一些库,这样我终于搞清楚gradle依赖是从哪里来的了。
事实上,这个Jcenter库是一家叫做bintray的机构维护,它作为google android官方默认的中央库.但在android studio的早期版本中默认使用的是maven库,它是由sonatype机构维护的。目前主要存在的三个依赖库为:
库名 | 维护机构 | android studio调用 |
---|---|---|
jcenter | bintray | jcenter() |
maven | sonatype | mavenCentral() |
lvy | sonatype | //一般在ant中使用 |
三者都是基于Apache Maven的规则来进行依赖。
aar文件其实和jar文件作用是一样的,唯一的区别在于aar是专门针对android项目优化过的jar文件,里面除了jar以外还包括了res\string等资源文件。
为了让自己的项目也能够被全世界的开发者使用,我们可以通过将lib项目发布到jcenter库中,在配置脚本之前我们需要先去官网注册一个帐号,传送门:bintray 也可以使用第三方登录的方式来登录,包括github、google、facebook帐号等。注册成功后我们先要获取到一个api key。
在Jcenter库中要求上传到库中的项目必须包含4个文件:
- javadoc.jar
- sources.jar
- aar或者jar
- pom
如果少了审核可能不会通过,当然这几个文件都可一通过配置gradle脚本来自动生成。
为了创建上面所说的几个文件,我们需要构建脚本来自动生成对应的文件。具体可以参考:github-SwipeView-build.gradle
将项目文件根目录(Top-level)下面的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版本的。
在需要上传的library项目的build.gradle下增加插件引用和版本号:
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
version = "1.0"
注意:版本号作为项目坐标的一部分,以后在升级项目的时候都需要升级版本号,否则会覆盖掉已经上传的版本.
关于插件bintray的更详细的使用方式可以查看:github-bintray
生成POM文件build脚本
def siteUrl = 'https://github.com/daliyan/SwipeView' // 项目的主页
def gitUrl = 'https://github.com/daliyan/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 '[email protected]'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
注意:group = “akiyama.swipe”作为项目坐标的前缀,packaging ‘aar’ 为arr包,其它的自己随意填写。
添加生成任务:
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"
}
}
使用前面的我们注册帐号和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库中了。
到官网找到我们刚刚上传的文件,提交审核就行了(别跟我说你找不到),一般2-3个小时就能审核成功。
成功后可以通过http://jcenter.bintray.com/ 查询到你的库文件,例如我的项目文件路径为:http://jcenter.bintray.com/akiyama/swipe/library/2.1
在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项目
在构建脚本过程中可能会出现一些问题:
- GBK编码问题,前文已经提供了解决方案;
- 依赖库问题,可能会报告一些警告,只要保证最后构建成功,直接忽略即可;
- gradle依赖问题:可以参照githug-bintray 解决方案:
Gradle >= 2.1
plugins {
id "com.jfrog.bintray" version "1.3.1"
}
Gradle < 2.1
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3.1'
}
}
apply plugin: 'com.jfrog.bintray'
本文学习了gradle的一些基本知识和基本的构建,学习了如何将lib库上传到中央仓库中,以及在这个过程中可能遇到的问题。