概述
有道无术,术尚可求,有术无道,止于术。
文章目录
- 什么是依赖管理?
- 声明存储库
- 声明依赖
- 插件
- 获取方式
- 类型
- 核心插件
- 非核心插件
什么是依赖管理?
dependency(依赖)
是指向构建、测试或运行模块添加所需的另一软件的声明。
软件项目在大多数情况下都不是孤立存在的,项目依赖于可重用功能的代码库(第三方JAR包),一般整个项目都会分解为很多模块以组成模块化系统。
依赖管理
是一种以自动化方式声明、解析和使用项目所需依赖的技术。
Gradle 内置了对依赖项管理的支持,下图中所示基本流程,会从互联网的存储库中获取依赖到本地或缓存中,然后给当前程序提供依赖支持:
声明存储库
我们在编写代码时,除了JDK,肯定还需要用到开源的依赖项,这些依赖都存放在二进制存储库中,比如Maven Central
(Maven 中央仓库)和Google Android
存储库。Gradle 为这些经常使用的存储库提供了内置的速记符号。
repositories{}
是仓库配置,默认配置的是Maven 中央仓库,通过repositories
可以配置maven,ivy, local仓库。
repositories {
// 引入中央仓库
mavenCentral()
}
一般开发中会配置阿里云、私服仓库,如下所示:
repositories {
// 本地
mavenLocal()
// 阿里云
maven {
name 'Alibaba Maven Repository'
url 'https://maven.aliyun.com/nexus/content/groups/public/'
}
// maven 中央仓库
mavenCentral()
// 私服
maven {
// 需要认证时,配置用户名密码
credentials {
username 'username'
password 'password'
}
name 'My Maven Repository'
url 'http://localhost:8081/repository/jzman-releases/'
}
}
如果你的依赖包在本地文件目录中,可以使用以下方式引入:
repositories {
flatDir {
dirs 'lib'
}
flatDir {
dirs 'lib1', 'lib2'
}
}
声明依赖
在声明依赖时,每个依赖项都需要确定其特定范围,比如有些依赖项只用于测试,有些只用于运行时可用。
在Gradle 中,使用dependencies{}
来声明依赖项。格式为:
dependencies {
// 配置名称 依赖符号
configurationName dependencyNotation
}
其中configurationName
是一个Configuration
名称,表示一个分组,声明的Configuration
名称相同的依赖会划分到一组中,每一组的作用范围不一样。
dependencyNotation
表示依赖的坐标,可以使用group:name:version
格式来表示,看起来比Maven 简洁多了。
比如下方实例中,引入了远程和本地依赖,其中implementation
表示该分组的依赖只能作用于当前模块,如果其他功能引入该项目的JAR 包,将无法访问该依赖中的方法,只让设计的目的是为了提升性能。testImplementation
表示该分组只作用于Test
目录,也就是该依赖只在单元测试(Junit)中有效。
plugins {
id 'java'// 这样就可以使用 'implementation', 'testImplementation'
}
dependencies {
// 1. 在存储库中引入依赖
// group:name:version 风格
implementation 'commons-lang:commons-lang:2.6'
// Map 风格
implementation group: 'com.google.code.guice', name: 'guice', version: '1.0'
testImplementation 'org.mockito:mockito:1.9.0-rc1'
// 2. 将文件声明引入为依赖
implementation files('hibernate.jar', 'libs/spring.jar')
//将'libs'中的所有jar放入编译类路径
implementation fileTree('libs')
//依赖其他子项目
implementation project(':projectA')
}
configurationName
有以下几种:
-
compileOnly— 对于编译生产代码所必需但不应成为运行时类路径的一部分的依赖项
-
implementation(取代compile) — 用于编译和运行时
-
runtimeOnly(取代runtime)——仅在运行时使用,不用于编译
-
testCompileOnly— 与compileOnly测试相同
-
testImplementation— 测试等效于implementation
-
testRuntimeOnly— 测试等效于runtimeOnly
在实际使用过程中,为了避免冲突,需要排除依赖包中的某个子依赖,或者禁止这个依赖传递,可以用以下方式实现:
dependencies {
implementation('org.hibernate:hibernate:3.1') {
// 在版本冲突的情况下优先使用该版本
force = true
// 排除特定的依赖:
exclude module: 'cglib' // 按照模块排除
exclude group: 'org.jmock' // 按照组名排除
exclude group: 'org.unwanted', module: 'iAmBuggy' // 通过组名+模块排除
// 禁用此依赖项的所有传递依赖
transitive = false
}
}
当发生依赖冲突时,应该怎么查看呢?
方式1:直接通过IDEA 查看依赖树
方式2:通过gradlew.bat build --scan
命令扫描,然后输入YES:
然后访问地址,输入邮箱,在邮箱中再点击链接访问分析报告,和Maven 比起来,还是麻烦多了。。。
插件
插件可以封装一系列任务,例如编译,测试,打包等。IDEA、VsCode、Eclipse、Maven、Chrome等都是支持插件集成的工具。
插件意味着扩展,Gradle只要定义好插件规范,各大厂商或个人开发者遵循这个规范就能开发出很多有用的插件,从而丰富Gradle生态。
获取方式
获取插件的渠道有以下2种:
- 访问Gradle插件官网
- Github搜索,有一些插件并没有被官方所收录,但仍然能够使用,但需要承担一些隐藏的风险
现如今使用评率非常高的几款插件: SpringBoot构建插件,Docker容器集成插件,junit单元测试插件等。
类型
在Gradle中一般有两种类型的插件:
- 脚本插件
- 二进制插件
脚本插件script plugins
通常是一个脚本,和一个普通的 build.gradle
文件没什么区别。脚本插件其实并不能算是一个真正的插件,就是一个扩展脚本。但我们不能忽视它的作用,它是脚本模块化的基础。我们可以把复杂的脚本文件,进行分块,分段整理,拆分成一个个职责分明的脚本插件。就像我们平常封装的Utils工具类一样,封装一个utils.gradle
工具脚本。脚本可以存在本地,也可以存在网络上,只需要提供脚本的相对路径或者URL,引用方式如下;
//使用本地插件
apply from: "./other-gradle '
apply from: this.rootProject.file( "other.gradle ')
//使用网络远程插件
apply from: "https://gitee.com/xxx/xx/raw/master/it235.gradle“
我们可以通过的ID来引用二进制插件binary plugins
。插件ID是插件的全局唯一标识符或者名字。Gradle中的插件按照来源可以分为核心插件和非核心插件。Gradle核心插件的特殊之处就在于他们都有一个简短的ID,例如Java插件的是"java"。其它非核心二进制插件也必须使用插件ID的完全限定形式(例com.github.foo.bar )。
使用二进制插件的方式有2种:
- 结合
buildscript{}
应用插件 ,老版本中使用 plugins{}
写法,这种叫plugins DSL
写法
核心插件
可以在官网中查看所有的核心插件。
要应用的核心插件,可以使用短名称,比如下图中表示应用了一个java 插件,为构建任何类型的 Java 项目提供支持。
plugins {
id 'java'
}
Java 插件向你的项目添加了大量的任务(功能),如下所示:
非核心插件
非核心插件需要再官网重进行插件搜索,然后引用。
比如我们搜索谷歌打包容器镜像的插件jib
,然后就可以看到这个插件的功能描述,引入方式:
引入之后我们就可以在任务中查看到该插件了:
最后
以上就是曾经果汁为你收集整理的Gradle系列【3】如何引入依赖和插件的全部内容,希望文章能够帮你解决Gradle系列【3】如何引入依赖和插件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复