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

Xel*_*ian 95 configuration dependencies gradle

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

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

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

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

Pet*_*ser 141

在最常见的情况下,编译时所需的工件是运行时所需的工件的子集.例如,假设一个名为appuse 的程序使用库foo,而库foo 内部使用库bar.然后只foo需要编译app,但两者foobar都需要运行它.这就是为什么默认情况下,你把摇篮的一切compile配置也可见它的runtime配置,但相反的是不正确的.

  • 遗憾的是,这在http://www.gradle.org/docs/current/userguide/dependency_management.html中没有明确提及.他们使用编译和运行时没有明确说明其含义...... (19认同)
  • @silasdavis在文档中解释了差异:8.3中的http://www.gradle.org/docs/current/userguide/userguide_single.html#configurations.依赖配置 (2认同)

Kno*_*ads 20

根据最新的 gradle 版本更新答案。

\n

来自 gradle 的官方文档,链接如下:

\n

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

\n
\n

弃用

\n

不应再使用编译和运行时配置来声明依赖关系自 Gradle 3.4 起,不鼓励在 Java 生态系统插件中使用编译和运行时配置。

\n

应该使用implementation、api、compileOnly 和runtimeOnly 配置来声明依赖项,并使用compileClasspath 和\nruntimeClasspath 配置来解决依赖项。

\n
\n

更重要的是,在最近发布的 Gradle 7.0 版本中已经删除了编译依赖配置。

\n

如果您尝试在 Gradle 3.4+ 项目中使用编译,您\xe2\x80\x99将收到如下警告:

\n
\n

此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 7.0 不兼容。使用 \xe2\x80\x98\xe2\x80\x93warning-mode all\xe2\x80\x99 显示单个弃用警告。

\n
\n

对于依赖项,您应该始终使用实现而不是编译,并使用 runtimeOnly 而不是运行时。

\n

什么是实现依赖?

\n

当您\xe2\x80\x99构建和运行Java项目时,涉及两个类路径:

\n

编译类路径\xe2\x80\x93 JDK 能够将 Java 代码编译为 .class 文件所需的依赖项。

\n

运行时类路径\xe2\x80\x93 实际运行已编译的 Java 代码所需的依赖项。

\n

当我们\xe2\x80\x99配置Gradle依赖项时,我们\xe2\x80\x99真正做的就是配置哪些依赖项应该出现在哪个类路径上。鉴于只有两个类路径,我们有三个选项来声明我们的依赖项是有意义的。

\n
    \n
  1. compileOnly \xe2\x80\x93 仅将依赖项放在编译类路径上。
  2. \n
  3. runtimeOnly \xe2\x80\x93 仅将依赖项放在运行时类路径上。
  4. \n
  5. 实现\xe2\x80\x93 将依赖项放在两个类路径上。
  6. \n
\n
\n

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

\n
\n