【Gradle多模块系列4】JVM(java scala)项目的依赖管理
解析一个典型的构建脚本
让我们来看一个非常简单的JVM项目的构建脚本。它应用了Java Library插件,该插件自动引入标准的项目布局,提供执行常规工作和适当的依赖管理支持的任务。
plugins {
id 'java-library'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.hibernate:hibernate-core:3.6.7.Final'
api 'com.google.guava:guava:23.0'
testImplementation 'junit:junit:4.+'
}
dependencies
代码块声明了Hibernate core 3.6.7.Final是编译项目生产源代码所需的依赖项。它还指定了编译项目测试所需的junit >= 4.0。所有的依赖项都应该在Maven Central仓库中查找,如 repositories
声明的那样。
声明模块依赖
你可以声明各种类型的依赖项。其中一种类型是模块依赖。模块依赖表示对以特定版本构建的模块的依赖,这个模块是在当前构建之外构建的。模块通常存储在存储库中,例如Maven Central、企业Maven或Ivy存储库,或者本地文件系统中的目录。
要定义模块依赖,将其添加到依赖配置中:
dependencies {
implementation 'org.hibernate:hibernate-core:3.6.7.Final'
}
使用依赖配置
Configuration是一组命名的依赖项和构件。Configuration有三个主要用途:
- 声明依赖关系:插件使用配置使构建作者能够轻松地声明对其他子项目或外部构件在执行插件定义的任务期间的各种目的所需的依赖关系。例如,插件可能需要Spring Web框架依赖项来编译源代码。
- 解析依赖关系:插件使用配置来查找(可能还要下载)它定义的任务的输入。例如,Gradle需要从Maven Central下载Spring Web框架的JAR文件。
- 提供构件以供使用:插件使用配置来定义它为其他项目生成的构件。例如,项目希望将编译后的源代码打包成JAR文件发布到内部Artifactory存储库。
在考虑到这三个用途的情况下,让我们来看一下Java Library插件定义的一些标准配置。
- implementation:编译项目生产源的所需依赖项,这些依赖项不属于项目公开的API。例如,项目使用Hibernate作为其内部持久化层实现。
- api:编译项目生产源的所需依赖项,这些依赖项属于项目公开的API。例如,项目使用Guava并在方法签名中使用Guava类来公开接口。
- testImplementation:编译和运行项目测试源所需的依赖项。例如,项目决定使用JUnit来编写测试代码。
各种插件会添加更多的标准配置。你还可以通过Project.configurations{}在构建中定义自己的自定义配置。详情请参阅什么是依赖配置。
声明常见的Java存储库
Gradle如何知道在哪里找到外部依赖的文件?Gradle在存储库中查找它们。存储库是一个由组、名称和版本组成的模块集合。Gradle理解不同的存储库类型,例如Maven和Ivy,并支持通过HTTP或其他协议访问存储库的各种方式。
默认情况下,Gradle不定义任何存储库。你需要在使用模块依赖之前,使用Project.repositories{}定义至少一个存储库。一个选项是使用Maven Central存储库:
repositories {
mavenCentral()
}
你也可以在本地文件系统上有存储库。这适用于Maven和Ivy存储库。
repositories {
ivy {
// URL can refer to a local directory
url "../local-repo"
}
}
一个项目可以有多个存储库。Gradle会按照指定的顺序在每个存储库中查找依赖项,当找到包含所请求模块的第一个存储库时停止查找。
了解更多关于定义存储库的信息,请参阅声明存储库。
发布构件
要了解有关发布构件的更多信息,请参阅发布插件。
参考链接
小军李:【Gradle jvm插件系列1】 Java Application插件权威详解
小军李:【Gradle jvm插件系列2】 Java Library插件用法示例权威详解
小军李:【Gradle jvm插件系列3】 Java platform平台插件权威详解
小军李:【Gradle jvm插件系列4】 scala插件权威详解
小军李:【gradle多模块系列1】多项目构建和子项目的添加管理
小军李:【Gradle多模块系列2】在子项目之间声明依赖关系和共享构建逻辑示例详解