gradle
.gradle文件夹是缓存文件夹
implementation 是 Gradle 中声明依赖的一种方式,它定义了当前模块对某个依赖的引用,同时控制该依赖的可见性和传播性。
Gradle 中的 implementation
-
含义:
- 使用
implementation声明的依赖,当前模块可以使用它们,但这些依赖不会自动暴露给依赖当前模块的其他模块。 - 换句话说,它的作用域是“模块内部使用”。
- 使用
-
优点:
- 提高编译速度: 使用
implementation声明的依赖,Gradle 编译时可以减少任务检查和依赖分析的范围。 - 隔离依赖: 限制了依赖的传播,避免下游模块无意间使用当前模块的实现细节。
- 提高编译速度: 使用
常见依赖声明对比
以下是 Gradle 中常用的依赖范围关键词及其作用
| Gradle 关键词 | 作用 | 适用场景 |
|---|---|---|
| implementation | 编译期和运行期均可用,依赖不会传递到使用当前模块的其他模块中。 | 大多数普通依赖使用此范围,如通用工具库、业务代码所需依赖。 |
| api | 编译期和运行期均可用,依赖会传递到使用当前模块的其他模块中。 | 如果当前模块暴露的 API 使用了依赖中的类或方法,应使用此范围。 |
| compileOnly | 仅在编译期可用,运行时不可用。 | 容器提供的库(如 Servlet API)、注解处理器等编译期依赖。 |
| runtimeOnly | 仅运行时可用,编译期不可用。 | 运行时需要但编译时不需要的库(如 JDBC 驱动)。 |
| testImplementation | 测试代码中可用,不会影响生产代码。 | 单元测试框架(如 JUnit、Mockito)或测试工具。 |
| testRuntimeOnly | 测试代码运行时可用,但测试编译期不可用。 | 测试阶段运行所需的库(如特定数据库驱动)。 |
| annotationProcessor | 编译时注解处理器,用于生成代码的库。 | 例如 Lombok 或其他需要注解处理器的工具。 |
| providedCompile | 类似 compileOnly,但会传递到编译环境中(多用于 WAR 打包)。 | Web 应用中需要运行环境(如服务器)提供支持的库。 |
| providedRuntime | 运行期依赖,通常由外部环境(如应用服务器)提供。 | 仅用于 WAR 插件的配置,如 Web 容器运行时库。 |
示例
假设有一个模块 library,它依赖 commons-lang3,而另一个模块 app 依赖 library:
-
如果
library中用implementation声明依赖:// library/build.gradledependencies {implementation 'org.apache.commons:commons-lang3:3.12.0'}- 在
library模块中可以使用commons-lang3的类。 - 但在
app模块中,commons-lang3不会被传递,必须手动添加依赖。
- 在
-
如果
library中用api声明依赖:// library/build.gradledependencies {api 'org.apache.commons:commons-lang3:3.12.0'}- 在
library和app模块中都可以使用commons-lang3的类。 api会暴露commons-lang3给所有依赖library的模块。
- 在
总结
implementation 是 Gradle 中用于声明模块内部依赖的最佳实践,除非需要显式暴露依赖给其他模块(这种情况用 api),大部分场景都应使用
implementation。这样可以实现模块间的高内聚和低耦合,同时提高构建效率。
gradlew:这是在 Unix 类系统(包括 macOS 和 Linux)上运行 Gradle 的可执行脚本。它是一个 shell 脚本,用于包装 Gradle Wrapper,确保使用正确的 Gradle 版本来执行构建任务。 gradlew.bat:这是在 Windows 系统上运行 Gradle 的批处理文件。它是一个批处理脚本,用于包装 Gradle Wrapper,确保使用正确的 Gradle 版本来执行构建任务。 这些文件通常位于项目的根目录下,并且是通过运行 gradle wrapper 命令自动生成的。