一、Gradle是什么?
Gradle是一个基于JVM的构建工具,它允许开发人员描述构建过程中需要执行的任务,并使用声明式语法指定任务之间的依赖关系。Gradle依赖关系是它的重要组成部分,初学者应该理解它的基本概念。
二、什么是Gradle依赖?
Gradle依赖是将外部模块或库引入到项目中的一种方式。通过Gradle依赖声明,Gradle将在构建期间自动获取并导入所需的jar文件或库文件。
三、如何使用Gradle依赖?
在Gradle项目中,如果你需要添加一个外部库,你可以在配置文件文件中使用语法 `implementation 'group:name:version'` (也可以用`api`或`compileOnly` 代替 `implementation`,具体见下文)。其中,'group'代表库所属的组,'name'代表库的名称,'version'代表库的版本。例如:
implementation 'junit:junit:4.13.1'
这个依赖告诉Gradle自动获取junit库的版本4.13.1,你就可以在项目中使用junit的类了。
四、Gradle依赖的类型
Gradle提供了三种不同类型的依赖:
1. implementation类型的依赖
`implementation`表示该依赖只在当前 module 中有效,而不会传递给其他依赖它的 module。如果没有指定依赖类型,则默认使用`implementation`。
示例代码:dependencies { implementation 'com.google.code.gson:gson:2.8.6' }
2. api类型的依赖
`api`类型的依赖将会传递给其他依赖它的 module,以便于其他 module 中的代码可以使用这些依赖相关的 API。该类型的依赖在模块或库的 API 保持稳定,适合 ThirdParty 使用的时候建议使用。
dependencies { api 'com.google.code.gson:gson:2.8.6' }
3. compileOnly类型的依赖
`compileOnly`只在编译阶段有用,而不会在最终的打包结果中出现。这种依赖在你的代码中仅用于编译检查,但不会在运行时加载。可以使用这种依赖类型来解决在模块中引用其他模块造成的多余依赖版本问题。
dependencies { compileOnly 'junit:junit:4.13.1' }
五、Gradle依赖的版本规则
Gradle支持使用多种方法指定依赖的版本。下面列举一些实用的版本规则:
1. 固定版本号
比如这种写法,完全指定使用的版本号 `implementation 'junit:junit:4.13.1'`。
2. 动态版本号
有时,我们可能想要使用最新的库版本。Gradle支持使用通配符'*'来指定最新的版本号。例如:
implementation 'junit:junit:4.13.+'
这个依赖将优先使用版本4.13.x中的最新版本。
3. 区间版本号
当我们想要使用一系列版本号时,可以使用开区间或闭区间。例如:
implementation 'junit:junit:[4.12, 4.13.1]'
这个依赖将允许使用4.12及以上但低于4.13.1的版本。
六、Gradle依赖的排除机制
如果你添加的一个依赖包含其他不需要的依赖项,Gradle允许你排除这些不需要的依赖项。下面是一个带有不必要依赖项的依赖的示例代码:
implementation 'com.example:foo:1.0.0' { exclude group: 'org.unwanted', module: 'unwanted-module' }
在这个示例中,Gradle会自动获取组`com.example`中的`foo`以及其所有依赖的库,但会排除组`org.unwanted`中的`unwanted-module`库。这可以有效避免依赖冲突和不必要的jar重复引用。
七、Gradle依赖的传递性
Gradle依赖机制的一个重要特性是传递性:如果一个模块依赖一个库,那么该库自己依赖的库也会自动成为模块的依赖项。这就是所谓的传递性依赖。
例如:
dependencies { implementation 'com.example:foo:1.0.0' }
在这个示例中,如果`foo`库依赖于`bar`和`baz`库,则这些库也成为项目的依赖项。
八、Gradle依赖的作用域
Gradle允许为依赖指定不同的作用域。不同的作用域可以控制某个依赖是否在编译期、运行期或测试期可用。以下是Gradle支持的一些作用域:
1. compileOnly
这个作用域只在编译时有效,不在打包后的文件中生效。
2. implementation
这个作用域在编译和运行时都是有效的。
3. testImplementation
这个作用域只在测试代码编译和运行时有效。
九、Gradle依赖的远程资源
Gradle允许从远程存储库中下载并使用依赖库。Gradle支持常用的Maven仓库、JCenter等。这意味着不必手动下载和添加依赖项,而是可以从多个仓库中选择和添加所需的库。
例如,下面的示例依赖将自动从Maven中央存储库中下载支持的库:
repositories { mavenCentral() } dependencies { implementation 'com.google.guava:guava:29.0-jre' }
十、Gradle依赖的本地资源
除了远程存储库,Gradle还支持使用本地文件系统中的库作为依赖项。通过在`dependencies`声明中添加本地路径,您可以将本地库添加为项目的依赖项。
例如,下面的依赖项将模块添加为本地依赖项:
dependencies { implementation files('libs/local-library.jar') }
总结
Gradle依赖是Gradle构建系统的重要组成部分,理解依赖机制可以帮助我们更有效地管理和组织代码库。依赖类型、版本规则、排除机制、传递性、作用域、远程资源和本地资源是掌握Gradle依赖机制的重要要素。通过深入了解和使用依赖机制,我们可以为自己的项目带来许多方便和灵活的特性。