Gradle 中的“提供”依赖项

2022-09-01 04:12:30

我面前有一些依赖项,但文档中我没有看到此依赖项范围。build.gradleprovided

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


答案 1

什么是范围?provided

假设编译代码需要 a,但 jar 存在于生产环境库集合中。然后,您无需将jar与项目存档打包在一起。为了支持此要求,Maven 有一个名为 的作用域。如果将任何 jar 依赖项声明为 ,则在编译期间,此 jar 将存在于类路径中,但不会与项目归档一起打包。jarprovidedprovided

provided范围非常有用,特别是在Web应用程序中。例如,需要存在于类路径中才能编译项目,但不需要将其与 .有了范围,就可以达到这个要求。servlet-api.jarservlet-api.jarwarprovided

在名为 的 Gradle 插件中没有定义作用域。也不在 插件 或 插件。如果要在项目中使用作用域,则必须在文件中定义它。下面是在 gradle 中声明作用域的代码片段:javaprovidedwarandroidprovidedbuild.gradleprovided

configurations {
    provided
}

sourceSets {
    main { compileClasspath += configurations.provided }
}

现在,您的第二个问题:

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

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

在编译期间,Gradle 将添加到您的类路径中,但不会添加 。因为, 不是编译所必需的。但是,它将打包两者,并将与项目存档打包在一起,因为两者都是在生产环境中运行项目存档所必需的。通常,生产环境中所需的所有依赖项都称为依赖项。XYYXYXYruntime

在Gradle官方文档中,它说依赖性是“生产类在运行时所需的依赖关系。默认情况下,还包括编译时依赖项runtime

现在,如果你已经读到这里,那么你已经知道这是我们不希望存在于依赖关系中的依赖关系(基本上,我们不希望它与项目存档一起打包)。providedcompileruntime

以下是 和 范围的说明。这里,是指编译项目所需的依赖项,并引用项目编译不需要的依赖项。providedruntimecompilenon-compile


答案 2

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

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


推荐