我面前有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
依赖范围有什么区别?
答案 0 :(得分:33)
什么是
provided
范围?
假设编译代码需要jar
,但jar存在于生产环境库集合中。然后,您不需要将jar打包到项目档案中。为了支持这一要求,Maven有一个名为provided
的范围。如果您将任何jar依赖项声明为provided
,那么此jar将在编译期间出现在您的类路径中,但不会与您的项目存档一起打包。
provided
范围非常有用,尤其是在Web应用程序中。例如,您的类路径中需要servlet-api.jar
来编译您的项目,但您不需要使用servlet-api.jar
将war
文件打包到您的provided
。使用java
范围可以达到此要求。
在名为provided
的Gradle war
插件中没有定义范围。也不在android
或provided
插件中。如果要在项目中使用build.gradle
范围,则必须在provided
文件中对其进行定义。以下是在gradle中声明configurations {
provided
}
sourceSets {
main { compileClasspath += configurations.provided }
}
范围的代码段:
compile
现在,你的第二个问题:
Gradle中提供的和运行时依赖范围之间有什么区别?
首先回答这个问题,我将定义compile
依赖关系。 X
依赖项是依赖项,这些是编译代码所必需的。现在想象一下,如果您的代码使用名为X
的库,那么您必须将X
声明为编译时依赖项。还要设想Y
在内部使用另一个库Y
,并将X
声明为运行时依赖项。
在编译过程中,Gradle会将Y
添加到您的类路径中,但不会添加Y
。因为编译不需要X
。但它会将Y
和X
打包到您的项目存档中,因为在生产环境中运行项目存档需要Y
和runtime
。通常,生产环境中所需的所有依赖项都称为runtime
依赖项。
在Gradle官方documentation中,它表示provided
依赖项是“ 生产类在运行时所需的依赖项。默认情况下,还包括编译时依赖项。< / EM> 强>”。
现在,如果您已经阅读了这篇文章,那么您已经知道compile
是runtime
依赖项,我们不希望它出现在provided
依赖项中(基本上,我们不希望它与项目档案打包。)
以下是runtime
和compile
范围的说明。这里,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 插件增加了两个依赖配置:
向providedCompile 或providedRuntime 添加条目将导致从war 文件中排除该依赖项。
示例:
providedCompile 'org.springframework.boot:spring-boot-starter-tomcat:1.1.6.RELEASE'
上述 JAR 及其传递依赖仅在编译时可用,但在运行时不可用。这意味着,那些 JAR 将不会被包含在战争档案中。