'所提供的' Gradle中的依赖

时间:2015-06-09 11:45:39

标签: java gradle dependency-management

我面前有build.gradle,有一些依赖项声明为provided,但在documentation我没有看到这个依赖范围。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.2.4.RELEASE")
    ....

    provided 'backport-util-concurrent:backport-util-concurrent:3.1'
    provided 'org.javolution:javolution:5.5.1@jar
    ....
}

这是由插件提供的吗?如果是这样,我怎么知道它属于哪个插件?

Gradle中的providedruntime依赖范围有什么区别?

4 个答案:

答案 0 :(得分:33)

  

什么是provided范围?

假设编译代码需要jar,但jar存在于生产环境库集合中。然后,您不需要将jar打包到项目档案中。为了支持这一要求,Maven有一个名为provided的范围。如果您将任何jar依赖项声明为provided,那么此jar将在编译期间出现在您的类路径中,但不会与您的项目存档一起打包。

provided范围非常有用,尤其是在Web应用程序中。例如,您的类路径中需要servlet-api.jar来编译您的项目,但您不需要使用servlet-api.jarwar文件打包到您的provided。使用java范围可以达到此要求。

在名为provided的Gradle war插件中没有定义范围。也不在androidprovided插件中。如果要在项目中使用build.gradle范围,则必须在provided文件中对其进行定义。以下是在gradle中声明configurations { provided } sourceSets { main { compileClasspath += configurations.provided } } 范围的代码段:

compile

现在,你的第二个问题:

  

Gradle中提供的和运行时依赖范围之间有什么区别?

首先回答这个问题,我将定义compile依赖关系。 X依赖项是依赖项,这些是编译代码所必需的。现在想象一下,如果您的代码使用名为X的库,那么您必须将X声明为编译时依赖项。还要设想Y在内部使用另一个库Y,并将X声明为运行时依赖项。

在编译过程中,Gradle会将Y添加到您的类路径中,但不会添加Y。因为编译不需要X。但它会将YX打包到您的项目存档中,因为在生产环境中运行项目存档需要Yruntime。通常,生产环境中所需的所有依赖项都称为runtime依赖项。

在Gradle官方documentation中,它表示provided依赖项是“ 生产类在运行时所需的依赖项。默认情况下,还包括编译时依赖项。< / EM> ”。

现在,如果您已经阅读了这篇文章,那么您已经知道compileruntime依赖项,我们不希望它出现在provided依赖项中(基本上,我们不希望它与项目档案打包。)

以下是runtimecompile范围的说明。这里,non-compile指的是编译项目所需的依赖项,{{1}}指的是项目编译不需要的依赖项。

答案 1 :(得分:1)

从gradle 2.12开始,您可以使用compileOnly选项。

请参见

https://blog.gradle.org/introducing-compile-only-dependencies

答案 2 :(得分:0)

为进一步澄清,从最新版本开始,Gradle 5.5具有compileOnly(与提供的相同)和runtimeOnly选项。新的默认编译和运行时选项是实现。

答案 3 :(得分: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 而不是运行时。

战争插件

<块引用>

War 插件扩展了 Java 插件以添加对组装 Web 应用程序 WAR 文件的支持。它禁用默认的 JAR 存档 生成 Java 插件并添加默认 WAR 存档任务。

War 插件增加了两个依赖配置:

  1. 提供编译
  2. 提供运行时

向providedCompile 或providedRuntime 添加条目将导致从war 文件中排除该依赖项。

  1. 如果您的源代码依赖于某些类,请使用providedCompile 用于编译。
  2. 如果将providedRuntime 用于测试而不是用于测试,请使用它 编译。

示例:

providedCompile 'org.springframework.boot:spring-boot-starter-tomcat:1.1.6.RELEASE'

上述 JAR 及其传递依赖仅在编译时可用,但在运行时不可用。这意味着,那些 JAR 将不会被包含在战争档案中。