【发布时间】:2013-05-18 01:06:37
【问题描述】:
我的问题有点常见,但也与 Gradle 相关。
为什么我们需要编译和运行时配置?
当我编译某些东西时,我需要工件来将我的 java 类转换为字节码,所以我需要编译配置,但是为什么需要运行时配置我还需要其他东西来在 JVM 中运行我的应用程序?
对不起,如果这听起来很愚蠢,但我不明白。
【问题讨论】:
标签: configuration dependencies gradle
我的问题有点常见,但也与 Gradle 相关。
为什么我们需要编译和运行时配置?
当我编译某些东西时,我需要工件来将我的 java 类转换为字节码,所以我需要编译配置,但是为什么需要运行时配置我还需要其他东西来在 JVM 中运行我的应用程序?
对不起,如果这听起来很愚蠢,但我不明白。
【问题讨论】:
标签: configuration dependencies gradle
在最常见的情况下,编译时所需的工件是运行时所需工件的子集。例如,假设一个名为app 的程序使用库foo,而库foo 在内部 使用库bar。那么编译app只需要foo,但是运行它需要foo和bar。这就是为什么默认情况下,您在 Gradle 的 compile 配置中放置的所有内容在其 runtime 配置中也可见,但反之则不然。
【讨论】:
根据最新的 gradle 版本更新答案。
来自以下链接的 gradle 官方文档:
https://docs.gradle.org/current/userguide/upgrading_version_5.html
弃用
不应再使用编译和运行时配置声明依赖关系编译和运行时的使用 不鼓励 Java 生态系统插件中的配置 从 Gradle 3.4 开始。
需要使用 implementation、api、compileOnly 和 runtimeOnly 配置来声明依赖和 compileClasspath 和 runtimeClasspath 配置来解决依赖关系。
更重要的是,在最近发布的 Gradle 7.0 版本中,已经删除了编译依赖配置。
如果您尝试在 Gradle 3.4+ 项目中使用 compile,您将收到如下警告:
此版本中使用了已弃用的 Gradle 功能,使其 与 Gradle 7.0 不兼容。使用‘–warning-mode all’来显示 个别弃用警告。
您应该始终使用实现而不是编译依赖项,并使用 runtimeOnly 而不是运行时。
什么是实现依赖?
当您构建和运行 Java 项目时,涉及到两个类路径:
编译类路径 – JDK 能够将 Java 代码编译为 .class 文件所需的那些依赖项。
运行时类路径 – 实际运行已编译的 Java 代码所需的那些依赖项。
当我们配置 Gradle 依赖项时,我们真正要做的就是配置哪些依赖项应该出现在哪个类路径上。鉴于只有两个类路径,因此我们可以使用三个选项来声明我们的依赖项。
如果您需要依赖项同时位于编译和运行时类路径上,请使用实现依赖项配置。如果不, 考虑 compileOnly 或 runtimeOnly。
【讨论】: