Gradle中编译和运行时配置之间的区别

时间:2013-05-22 20:23:01

标签: configuration dependencies gradle

我的问题有点普遍,但它也与Gradle有关。

为什么我们需要编译和运行时配置?

当我编译一些东西时,我需要工件来转换我的字节码中的java类,所以我需要编译配置,但为什么需要运行时配置我还需要别的东西在JVM中运行我的应用程序吗?

对不起,如果它听起来很愚蠢,但我不明白。

2 个答案:

答案 0 :(得分:130)

在最常见的情况下,编译时所需的工件是运行时所需的工件的子集。例如,我们假设名为app的程序使用库foo,而内部库foo 使用库bar。然后,只需foo来编译app,但运行它需要foobar。这就是为什么默认情况下,您在Gradle compile配置上所做的一切也在其runtime配置中可见,但相反的情况并非如此。

答案 1 :(得分:0)

根据最新的 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 依赖项时,我们真正要做的就是配置哪些依赖项应该出现在哪个类路径上。鉴于只有两个类路径,我们有三个选项来声明我们的依赖项是有道理的。

  1. compileOnly – 仅将依赖放在编译类路径上。
  2. runtimeOnly – 仅依赖运行时类路径。
  3. 实现 – 将依赖放在两个类路径上。
<块引用>

如果您需要在编译和运行时类路径上都存在依赖项,请使用实现依赖项配置。如果不, 考虑 compileOnly 或 runtimeOnly。