03.19 Gradle学习记录014 关于依赖的声明

详细学习Gradle构建的依赖声明。该学习记录基于Gradle官方网站资料。本篇参考链接如下:

https://docs.gradle.org/current/userguide/declaring_dependencies.html

通常声明一个模块作为依赖,需要指定这个模块的版本。Gradle提供了一套机制,允许指定动态的版本。

Gradle学习记录014 关于依赖的声明

指定固定版本

dependencies {
// 固定版本一旦指定就不会变化
implementation 'org.springframework:spring-web:5.0.2.RELEASE'
}

不指定版本的依赖

比较大的项目可能不会去单独指定依赖的版本,而是使用constraints来统一管理版本

dependencies {
// 这里没有指定依赖的版本
implementation 'org.springframework:spring-web'
}
dependencies {
constraints {
// 在constraints内部指定版本
implementation 'org.springframework:spring-web:5.0.2.RELEASE'
}
}

动态指定版本

dependencies {
// 这里指定版本必须为5以上
implementation 'org.springframework:spring-web:5.+'
}

通常,Gradle会在缓存中保存上一次取得的版本24小时。24小时之后如果发现有更新的版本,会去取得更新的版本。

指定未完成版本

dependencies {
implementation 'org.springframework:spring-web:5.0.3.BUILD-SNAPSHOT'
}

如上,一般带有-SNAPSHOT后缀的版本是还在开发中的版本。和动态指定一样, 24小时后会到仓库中寻找是否有更新版本。

通过参数指定版本

Gradle学习记录014 关于依赖的声明

dependencies {
implementation('org.slf4j:slf4j-api') {
version {
strictly '[1.7, 1.8['
prefer '1.7.25'
}
}
constraints {
implementation('org.springframework:spring-core') {
version {
require '4.2.9.RELEASE'
reject '4.3.16.RELEASE'
}
}
}
}

有时可能会需要一些文件依赖, 这些文件保存在本地或者远程的共享文件夹中。这种共享文件夹式的仓库时没有.metadata的。

Gradle学习记录014 关于依赖的声明

所以需要指定文件的名字

configurations {
antContrib
externalLibs
deploymentTools
}
dependencies {
antContrib files('ant/antcontrib.jar')
externalLibs files('libs/commons-lang.jar', 'libs/log4j.jar')
deploymentTools(fileTree('tools') { include '*.exe' })
}

多工程构建的时候, 经常会发生工程间的依赖。

Gradle学习记录014 关于依赖的声明

project(':web-service') {
dependencies {
implementation project(':utils')
implementation project(':api')
}
}

指定特定的资源

以下三种情况,可能需要指定特定的资源,而不时把整个jar包或者特定资源的传递依赖都下载到本地。

1 这个依赖时一个非标准资源, 比如一个zip文件

2 模块的.metadata定义了多个资源,但是我们只想要其中之一

3 我们只想要模块中的一个资源, 儿不需要它的传递依赖

下面的示例展示了从一个模块中只取得js类库

repositories {
ivy {
url 'https://ajax.googleapis.com/ajax/libs'
patternLayout {
artifact '[organization]/[revision]/[module](.[classifier]).[ext]'
}
}
}
configurations {
js
}
dependencies {
js 'jquery:jquery:3.2.1:min@js'
}

Classifier表示资源的种类。比如java的情况下,可能java的class在一个jar包中,它的源代码在另一个包中,它的javadoc在第三个包中。

那么这三个包的名字中会用classifier来表明不同。比如

XXXX.jar

XXXX.sources.jar

XXXX.javadoc.jar


分享到:


相關文章: