在Gradle中提供'依赖'

dev*_*ull 16 java dependency-management gradle

build.gradle在我面前有一些声明的依赖项,provided但在文档中我没有看到这个依赖范围.

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
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

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

Saz*_*man 39

什么是provided范围?

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

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

Gradle java插件中没有定义Scope provided.也不在插件warandroid插件中.如果要provided在项目中使用范围,则必须在build.gradle文件中定义范围.以下是provided在gradle中声明范围的代码段:

configurations {
    provided
}

sourceSets {
    main { compileClasspath += configurations.provided }
}
Run Code Online (Sandbox Code Playgroud)

现在,你的第二个问题:

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

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

在编译期间,Gradle将添加X到您的类路径中但不会添加Y.因为,Y编译不需要.但是,这两种包装XY使用,因为两个项目档案X,并Y为需要运行在生产环境中的项目归档.通常,生产环境中所需的所有依赖项称为runtime依赖项.

在Gradle官方文档中,它表示runtime依赖性是" 生产类在运行时所需的依赖性.默认情况下,还包括编译时依赖性. ".

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

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

  • Gradle 自己在这里写道,“runtime”应该替换为“runtimeOnly”,“provided”应该替换为“compileOnly” https://docs.gradle.org/current/userguide/migrating_from_maven.html#migmvn:migration_deps (4认同)
  • `compileOnly` 配置是最接近 maven“提供”范围的选项,但它不是真正的“仅在编译时”配置。例如,项目 Lombok 类在编译期间需要,但在运行时**永远**不需要,**永远**不应该**在运行时**提供,并且**永远**不应该**打包。这与编译和运行时需要但打包期间不需要的 servlet 依赖项不同,因为它们是由环境提供的。Maven 和 Gradle 都没有区分真正的“仅编译”和“提供编译”。 (3认同)
  • `runtime` 配置已被弃用,请使用 `runtimeOnly` 代替 (2认同)

Pau*_*NUK 5

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

看到

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

  • 从 Gradle 6.7 开始,还有“compileOnlyApi”依赖项:https://docs.gradle.org/6.7/release-notes.html#new-dependency-management-features (2认同)

gag*_*rwa 5

为了进一步说明,从最新版本开始,Gradle 5.5 具有compileOnly(与 相同provided)和runtimeOnly选项。新的默认“编译和运行时”选项是implementation.

  • 我可以。但在我看来,如果通过“compileOnly”包含一个库,我可以自动在测试中使用它,那会更方便。 (2认同)