'Provided' 依赖于 Gradle
'Provided' dependency in Gradle
我面前有 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 中的 provided
和 runtime
依赖范围有什么区别?
What is provided
scope?
假设需要 jar
来编译您的代码,但该 jar 存在于生产环境库集合中。然后您不需要将 jar 与您的项目档案一起打包。为了支持这个需求,Maven 有一个名为 provided
的范围。如果您将任何 jar 依赖项声明为 provided
,那么此 jar 将在编译期间出现在您的类路径中,但不会与您的项目存档一起打包。
provided
scope 非常有用,尤其是在 web 应用程序中。例如,servlet-api.jar
需要出现在您的类路径中才能编译您的项目,但您不需要它来将 servlet-api.jar
文件与您的 war
打包在一起。使用 provided
范围可以实现这一要求。
在名为 provided
的 Gradle java
插件中没有定义范围。也不在 war
或 android
插件中。如果你想在你的项目中使用 provided
范围,那么你必须在你的 build.gradle
文件中定义它。以下是在 gradle 中声明 provided
作用域的代码片段:
configurations {
provided
}
sourceSets {
main { compileClasspath += configurations.provided }
}
现在,你的第二个问题:
What is the difference between provided and runtime dependency scope in Gradle?
首先要回答这个问题,我将定义compile
依赖关系。 compile
依赖项是依赖项,它们是编译代码所必需的。现在想象一下,如果您的代码使用名为 X
的库,那么您必须将 X
声明为编译时依赖项。还假设 X
在内部使用另一个库 Y
,并且您将 Y
声明为您的 运行 时间依赖项。
在编译期间,Gradle 会将 X
添加到您的类路径中,但不会添加 Y
。因为 Y
不是编译所必需的。但它会将 X
和 Y
与您的项目存档一起打包,因为 X
和 Y
对于 运行 您在生产环境中的项目存档是必需的。通常,生产环境需要的所有依赖称为runtime
依赖。
在Gradle官方documentation中说runtime
依赖是“制作所需要的依赖类在 运行 时。默认情况下,还包括编译时依赖项。".
现在,如果您已经读到这里,那么您已经知道 provided
是一个 compile
依赖项,我们不希望它出现在 runtime
依赖项中(基本上,我们不希望它与项目存档一起打包)。
以下是 provided
和 runtime
范围的说明。这里compile
指的是编译项目需要的依赖,non-compile
指的是项目编译不需要的依赖。
从 gradle 2.12 开始,您可以使用 compileOnly 选项。
见
https://blog.gradle.org/introducing-compile-only-dependencies
为了进一步说明,从最新版本开始,Gradle 5.5 具有 compileOnly
(与 provided
相同)和 runtimeOnly
选项。新的默认“编译和运行时”选项是 implementation
.
正在根据最新的 gradle 版本更新答案。
来自 gradle 的官方文档 link:
https://docs.gradle.org/current/userguide/upgrading_version_5.html
Deprecations
Dependencies should no longer be declared using the compile and runtime configurations. The usage of the compile and runtime
configurations in the Java ecosystem plugins has been discouraged
since Gradle 3.4.
The implementation, api, compileOnly and runtimeOnly configurations should be used to declare dependencies and the compileClasspath and
runtimeClasspath configurations to resolve dependencies.
此外,在最近发布的Gradle7.0版本中,编译依赖配置已被删除。
如果您尝试在 Gradle 3.4+ 项目中使用编译,您将得到一个 warning 像这样:
Deprecated Gradle features were used in this build, making it
incompatible with Gradle 7.0. Use ‘–warning-mode all’ to show the
individual deprecation warnings.
对于依赖项,您应该始终使用实现而不是编译,并且使用 runtimeOnly 而不是运行时。
War插件
The War plugin extends the Java plugin to add support for assembling web application WAR files. It disables the default JAR archive
generation of the Java plugin and adds a default WAR archive task.
War插件添加两个依赖配置:
- 提供编译
- 提供运行时
向 providedCompile 或 providedRuntime 添加条目将导致该依赖项从 war 文件中排除。
- 如果您的源代码依赖某些 类,请使用 providedCompile
用于编译。
- 如果您将它用于测试而不是,请使用 providedRuntime
正在编译。
示例:
providedCompile 'org.springframework.boot:spring-boot-starter-tomcat:1.1.6.RELEASE'
上述JAR 及其传递依赖仅在编译时可用,但在运行时不可用。这意味着,这些 JAR 将不会包含在 war 存档中。
我面前有 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 中的 provided
和 runtime
依赖范围有什么区别?
What is
provided
scope?
假设需要 jar
来编译您的代码,但该 jar 存在于生产环境库集合中。然后您不需要将 jar 与您的项目档案一起打包。为了支持这个需求,Maven 有一个名为 provided
的范围。如果您将任何 jar 依赖项声明为 provided
,那么此 jar 将在编译期间出现在您的类路径中,但不会与您的项目存档一起打包。
provided
scope 非常有用,尤其是在 web 应用程序中。例如,servlet-api.jar
需要出现在您的类路径中才能编译您的项目,但您不需要它来将 servlet-api.jar
文件与您的 war
打包在一起。使用 provided
范围可以实现这一要求。
在名为 provided
的 Gradle java
插件中没有定义范围。也不在 war
或 android
插件中。如果你想在你的项目中使用 provided
范围,那么你必须在你的 build.gradle
文件中定义它。以下是在 gradle 中声明 provided
作用域的代码片段:
configurations {
provided
}
sourceSets {
main { compileClasspath += configurations.provided }
}
现在,你的第二个问题:
What is the difference between provided and runtime dependency scope in Gradle?
首先要回答这个问题,我将定义compile
依赖关系。 compile
依赖项是依赖项,它们是编译代码所必需的。现在想象一下,如果您的代码使用名为 X
的库,那么您必须将 X
声明为编译时依赖项。还假设 X
在内部使用另一个库 Y
,并且您将 Y
声明为您的 运行 时间依赖项。
在编译期间,Gradle 会将 X
添加到您的类路径中,但不会添加 Y
。因为 Y
不是编译所必需的。但它会将 X
和 Y
与您的项目存档一起打包,因为 X
和 Y
对于 运行 您在生产环境中的项目存档是必需的。通常,生产环境需要的所有依赖称为runtime
依赖。
在Gradle官方documentation中说runtime
依赖是“制作所需要的依赖类在 运行 时。默认情况下,还包括编译时依赖项。".
现在,如果您已经读到这里,那么您已经知道 provided
是一个 compile
依赖项,我们不希望它出现在 runtime
依赖项中(基本上,我们不希望它与项目存档一起打包)。
以下是 provided
和 runtime
范围的说明。这里compile
指的是编译项目需要的依赖,non-compile
指的是项目编译不需要的依赖。
从 gradle 2.12 开始,您可以使用 compileOnly 选项。
见
https://blog.gradle.org/introducing-compile-only-dependencies
为了进一步说明,从最新版本开始,Gradle 5.5 具有 compileOnly
(与 provided
相同)和 runtimeOnly
选项。新的默认“编译和运行时”选项是 implementation
.
正在根据最新的 gradle 版本更新答案。
来自 gradle 的官方文档 link:
https://docs.gradle.org/current/userguide/upgrading_version_5.html
Deprecations
Dependencies should no longer be declared using the compile and runtime configurations. The usage of the compile and runtime configurations in the Java ecosystem plugins has been discouraged since Gradle 3.4.
The implementation, api, compileOnly and runtimeOnly configurations should be used to declare dependencies and the compileClasspath and runtimeClasspath configurations to resolve dependencies.
此外,在最近发布的Gradle7.0版本中,编译依赖配置已被删除。
如果您尝试在 Gradle 3.4+ 项目中使用编译,您将得到一个 warning 像这样:
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use ‘–warning-mode all’ to show the individual deprecation warnings.
对于依赖项,您应该始终使用实现而不是编译,并且使用 runtimeOnly 而不是运行时。
War插件
The War plugin extends the Java plugin to add support for assembling web application WAR files. It disables the default JAR archive generation of the Java plugin and adds a default WAR archive task.
War插件添加两个依赖配置:
- 提供编译
- 提供运行时
向 providedCompile 或 providedRuntime 添加条目将导致该依赖项从 war 文件中排除。
- 如果您的源代码依赖某些 类,请使用 providedCompile 用于编译。
- 如果您将它用于测试而不是,请使用 providedRuntime 正在编译。
示例:
providedCompile 'org.springframework.boot:spring-boot-starter-tomcat:1.1.6.RELEASE'
上述JAR 及其传递依赖仅在编译时可用,但在运行时不可用。这意味着,这些 JAR 将不会包含在 war 存档中。