第8章依赖管理基础
这章会介绍一些Gradle中的依赖管理的基础知识。
8.1什么是依赖管理
粗略地说,依赖由两方面组成。第一,Gradle需要知道项目要构建或者执行的东西,以便于可以找到它们,我们把这些项目需要的文件称作项目的依赖。第二,Gradle需要构建和上传项目所生成的东西,我们把生成的文件叫做项目的发布。让我们来在更多细节上看看这两方面。
大多数项目都不是完全独立的。它们需要其他项目构建的文件来被编译、测试等。例如,为了在项目中使用Hibernate ,需要在classpath中加入一些Hibernate的jar文件;为了测试项目,需要在test classpath中加入一些额外的jar文件,比如说一个特定的JDBC驱动或者Ehcache JAR文件。
这些文件就是项目的依赖。Gradle需要你告知它项目的依赖是什么,以便于它可以找到这些依赖,并使这些依赖在项目中是可用的。这些依赖可能需要从远程的Maven或lvy仓库下载,或者是从本地目录加载,或者当在一个多项目构建中时,依赖也可能是被其他项目构建出来的。我们称这个过程为“依赖解决”(dependency resolution)。
经常地,项目的依赖本身会存在其他的依赖。举个例子,Hibernate 核心库需要在其classpath中申明依赖一些其他的库,才能够运行。因此,Gradle测试为你的项目执行测试的时候,它需要找到这些依赖,并使它们是可用的。我们称之为“过渡依赖”(transitivedependencies)。
大多数项目的主要目的是构建出一些在本身项目之外的地方可以使用的文件。例如,如果你的项目产生一个java库,那么你需要去构建一个jar文件,可能也会需要去构建一个包含源代码的jar文件,以及一些注视文档,并且在某些地方去发布它们。
这些输出文件组成了项目的发布。Gradle会小心的为你处理这重要的工作,你申明你的项目的发布,Gradle会构建它们并且在发布它们。确切来说,发布(publishing)代表你想要去做的事情。你可能想要将文件拷贝到本地目录,或者是将它们上传到远程的Maven或lvy仓库,或者是你可能在多项目构建中的另一个项目中使用这些文件。我们将这个过程称为发布(publication)。
8.2申明依赖
让我们来看一下依赖的申明。这里有个基础的构建脚本:
例子8.1申明依赖
applyplugin: 'java'
repositories{
mavenCentral()
}
dependencies{
compile group:'org.hibernate',name:'hibernate-core',version:'3.6.7.Final'
testCompile group:'junit',name:'junit',version:'4.+'
}
这里发生了什么呢?这个构建脚本描述了一些关于项目的内容。首先,申明需要hibernate核心库3.6.7.Final来编译项目代码。隐含地,在运行时需要hibernate核心库的依赖。构建脚本也同时申明依需要一个版本大于等于4.0的junit来编译项目的测试代码。构建脚本也告知去Maven中心仓库查找任何依赖。接下里会进行详细的说明。
8.3依赖配置
依赖被分到配置里面,一项配置可以简单地称为一系列的依赖,我们称为依赖配置。你可以用它们申明项目的外部依赖。正如我们稍后将会看到的,它们也被用来申明项目的发布。
Java插件定义了许多标准的配置,这些配置描述了Java插件所使用的类路径(classpaths)。
下面列出了一些依赖配置项。
编译(compile)
编译项目源代码所需要的依赖。
运行时(runtime)
classes在运行时所需要的依赖,默认包含编译时依赖。
测试编译(testCompile)
编译项目测试代码所需要的依赖,默认包含classes和编译时依赖。
测试运行时(testRuntime)
执行测试所需要的依赖。默认包含编译、运行时、测试编译依赖。
各种插件添加进一步的标准配置。你也可以定义自定义配置。依赖配置中的定义和定制依赖配置的更多细节参考50.3部分。
8.4外部依赖
有许多类型的依赖是可以被定义的。外部依赖就是其中的一种。这种依赖的对象不在当前的构建项目中,它们在远程仓库或者是本地文件系统的一个目录中。
将如下代码添加到依赖配置中,就可以定义一个外部依赖。
例子8.2外部依赖的定义
dependencies{
compile group : 'org.hibernate', name: 'hibernate-core', version:'3.6.7.Final'
}
外部依赖定义使用group、name、version属性。根据所使用的库不同,group和version是可选的。
有一种定义外部依赖的快捷方式,使用"group:name:version"格式的字符串。
例子8.3外部依赖的快捷定义
dependencies{
compile 'org.hibernate:hibernate-core:3.6.7.Final'
}
8.5仓库
Gradle是如何从外部依赖找到文件的呢?Gradle从仓库(repository)中寻找它们。仓库实际上是一堆文件的集合,这些文件通过group、name、version组织分类。Gradle支持很多仓库,比如Maven和Ivy,而且有不同的方式访问仓库,比如本地文件系统和HTTP。
默认地,Gradle没有定义任何仓库,在使用外部依赖之前,你需要定义至少一个仓库。一种选择是使用Maven central仓库。
例子8.4 使用 Maven central仓库
repositories{
mavenCentral()
}
也可以使用远程的Maven仓库
例子8.5使用远程Maven仓库
repositories{
maven{
url "http://repo.mycompany.com/maven2"
}
}
一个项目可能有多个仓库,Gradle会根据库的定义顺序来依次找到对应的依赖,如果找到了依赖,那么就不会在后面定义的仓库中寻找了。
8.6 发布产物
依赖位置也用来发布文件,这些文件被称为发布产物(publishing artifacts),或者通常称为产物(artifacts)。
插件做了一项很好的工作,定义项目的产物。因此你不需要告诉Gradle哪些需要发布。但是,你需要告诉Gradle将产物发布到哪个地方。方法是把库附在uploadArchives任务里。下面是一个发布到远程Ivy仓库的例子:
例子8.8发布到Ivy仓库
uploadArchives {
repositories {
ivy {
credentials {
username "username"
password "pw"
}
url"http://repo.mycompany.com"
}
}
}
现在,当你执行Gradle uploadArchives,Gradle就会构建和上传你的Jar,Gradle也会生成一个Ivy.xml文件,并且也会将它与Jar文件一同上传。
你也可以发布到Maven仓库,语法有一点点不同,因为发布到Maven仓库需要应用Maven插件。这种情况下,Gradle会生成和上传一个pom.xml文件。
例子8.9发布到Maven仓库
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}
}