章8:依赖关系管理基础
本章将介绍一些gradle依赖关系管理的基础
-
什么是依赖关系管理?
简略的说,依赖管理是由两部分组成的。首先,gradle需要知道你要构建或者运行的项目,以便找到它们。我们将这些导入的文件视为项目的依赖。第二,gradle需要构建或者打包你的项目产品。我们将这些导出的文件视为项目的发布。下面,让我们在细节上更多的了解这两个方面。
大部分项目都不是完全彻底的独立的。它们需要其他项目的构建文件,以便编译、测试等等。例如,为了在我的项目中使用Hibernate,当编译我的源文件时就需要在classpath添加一些Hibernate的jar包。为了运行测试,我需要在test classpath下添加另外一些jar包,比如独有的jdbc驱动、java的缓存框架。
这些项目依赖需要导入的文件。Gradle允许你告诉它你的项目依赖哪些文件,所以它才关心查找哪些依赖,并有效的导入到你项目中。这些依赖可能在远程Maven or Ivy下载,也可能在本地仓库中,或者是多项目构建中的另外的项目。我们把这个过程叫做依赖解析。
注意,该特性是gradle相对ant的优势所在。在ant中,你只能加载指定绝对路径或者相对路径的jar包。使用gradle,只需在依赖中声明这些"names"和层次结构就可以确定在哪里获取这些文件。你可以添加apache ivy来获取ant的类似操作,单gradle可以做的更好。
项目的依赖文件本身常常也有自己的依赖。例如,运行Hibernate核心库需要在classpath中声明数个其他类库。所以,当gradle测试你的项目时,也需要寻找并加载这些依赖文件。我们可以称其为依赖传递。
大多数项目的主要目标是构建一些可以在项目外运行的文件。例如,你的项目产品是一个java库,就需要构建一个jar包,或者一个jar源文件和一些文档,并在某些地方发布他们。
Gradle也负责发布项目文件这个重要工作。你声明项目的发布包,gradle负责构建并发布他们。恰好,这些发布包依赖于你想做的工作。你可能想复制这些文件到本地目录,或者上传到远程Maven or Ivy仓库,或者在多项目中的其他项目中使用。我们一般称这个过程为发布。
-
声明你的依赖
让我们来看一些依赖声明。下面是一个基础的构建脚本:
这里发生了什么呢?这个构建脚本描述了这个项目的少许内容。首先,它规定了编译项目源文件需要Hibernate core 3.6.7.Final,也就是说Hibernate core的依赖在运行中是必须的。同时,这个脚本也规定了测试项目需要任意junit >= 4.0版本库。它也向gradle表明需要访问maven*仓库寻找依赖文件。接下来的片段我们会有更详细的描述。
-
依赖配置项
Gradle中依赖关系根据配置项分组,一个配置项包含一组简单命名的依赖。我们将引用这些配置项。你可以使用它们为你的项目声明外部依赖。正如我们随后将要看到的,他们也被用来声明你的项目产品。
Java插件定义了许多标准的配置项。这些配置代码java插件所用的classpath。下面我们列出了一些常用项,当然你也可以在Table 23.5, "Java plugin - dependency configurations"中查看更多详情。
Compile
在编译项目源代码时需要的依赖
Runtime
运行项目classes需要的依赖。默认情况下,它也包含编译时依赖。
TestCompile
编译项目测试源代码时需要的依赖。默认情况下,它也包含编译的源文件及编译时依赖。
testRuntime
运行测试需要的依赖。默认情况下,它也包含编译、运行、测试编译时依赖。
不同的插件提供不同的更深入的标准的配置项。你也可以在你的构建脚本中定义自己独有的配置项。请在 Section 51.3, "Dependency configurations" 中查看定义配置项详情。
-
外部依赖
你可以声明各种类型的依赖。其中一种就是外部依赖,它依赖于当前构建外的一些文件。这些外部文件存储在一些仓库中,例如maven,Ivy或者本地文件系统。
定义一个外部依赖并添加到配置项中:
一个外部依赖可以用组、名称、版本等属性标识。这依赖于你所使用的仓库,组和版本是可选项,声明依赖的语法类似于:"group:name:version"。
寻求更多依赖定义和工作: Section 51.4, "How to declare your dependencies".
-
仓库
Gradle是怎么找到外部依赖文件的呢?gradle首先从仓库中寻找,一个仓库中集合了许多被分组、命名、版本组织的文件。Gradle能辨识不同的仓库类型例如maven、ivy,并且可以以不同的方式去访问这些仓库如本地文件系统、http等。
缺省时,gradle没有定义任何仓库。在使用外部依赖前,你最少需要定义一个仓库。其中一个选择就是maven*仓库:
当然也可以是一个远程maven仓库:
或者是一个远程ivy仓库:
最后,你也可以把仓库设置在本地文件系统中。这种方式对maven、ivy都是有效的。
一个项目可以有许多仓库。Gradle会根据声明顺序在这些仓库中检索依赖,当检索到指定模块时停止检索。
To find out more about defining and working with repositories, have a look at Section 51.6, "Repositories".
-
发布项目工件
依赖配置项也可以在发布文件中使用。我们通常称其为发布工件或者仅仅是工件。插件对项目发布工件的支持非常好,通常你不必向gradle声明需要发布什么。无论如何,你还是需要声明在哪里发布这些工件。你可以通过在uploadArchives任务附上仓库来实现发布工作。下面是一个发布到远程ivy仓库的示例:
现在,当你执行gradle uploadArchives,gradle就会构建并上传你的jar包。Gradle也会同时生成并上传一个ivy.xml。
当然,你也可以发布到maven*仓库中。这些语法有些微的不同。注意,发布到maven仓库中需要添加maven插件。当配置完成,gradle会生成并上传一个pom.xml。
To find out more about publication, have a look at Chapter 52, Publishing artifacts.
-
下一章是什么?
如果你对dsl感兴趣,可以进入章9查看详情。