我面前有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
....
}
这是由插件提供的吗?如果是,我怎么知道这是哪个插件?
Gradle中的provided
和runtime
依赖范围有何区别?
4条答案
按热度按时间46qrfjad1#
什么是
provided
作用域?假设需要一个
jar
来编译代码,但是这个jar已经存在于生产环境库集合中,那么您就不需要将jar与项目存档一起打包,为了支持这个需求,Maven有一个名为provided
的作用域,如果您将任何jar依赖项声明为provided
,那么这个jar将在编译过程中出现在类路径中,但不会与项目归档一起打包。provided
作用域非常有用,特别是在Web应用程序中。例如,servlet-api.jar
需要存在于您的类路径中以编译您的项目,但您不需要它来将servlet-api.jar
文件与war
打包在一起。使用provided
作用域可以满足此要求。名为
provided
的Gradlejava
插件中没有定义作用域。war
或android
插件中也没有定义作用域。如果要在项目中使用provided
作用域,则必须在build.gradle
文件中定义它。以下是用于在Gradle中声明provided
作用域的代码片段:现在,你的第二个问题:
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
指编译项目不需要的依赖项。q9yhzks02#
从Gradle 2.12开始,您可以使用
compileOnly
选项。见
https://blog.gradle.org/introducing-compile-only-dependencies
k97glaaz3#
为进一步说明,自最新版本起,Gradle 5.5提供了
compileOnly
(与provided
相同)和runtimeOnly
选项。新的默认“编译和运行时”选项为implementation
。wwwo4jvm4#
根据最新的gradle版本更新答案。
来自以下链接的Gradle官方文档:
https://docs.gradle.org/current/userguide/upgrading_version_5.html
过时
不应再使用编译和运行时配置声明依赖关系。自Gradle 3.4起,不建议在Java生态系统插件中使用编译和运行时配置。
应使用实现、API、compileOnly和runtimeOnly配置来声明依赖项,使用compileClasspath和runtimeClasspath配置来解析依赖项。
此外,在最近发布的Gradle 7.0版本中,编译依赖项配置已被删除。
如果您尝试在Gradle 3.4+项目中使用compile,您将收到如下警告:
此版本中使用了弃用的Gradle功能,因此与Gradle 7.0不兼容。使用“-warning-mode all”显示各个弃用警告。
对于依赖项,应始终使用实现而不是编译,并使用runtimeOnly而不是运行时。
战争插件
War插件扩展了Java插件,以添加对组装Web应用程序WAR文件的支持。它禁用Java插件的默认JAR归档生成,并添加默认WAR归档任务。
War插件添加了两个依赖项配置:
1.提供编译
1.提供的运行时
向providedCompile或providedRuntime添加条目将导致从war文件中排除该依赖项。
1.如果源代码依赖于某些类进行编译,请使用providedCompile。
1.如果将providedRuntime用于测试而不是编译,请使用它。
示例:
上述JAR及其传递依赖项将只在编译时可用,而在运行时不可用。这意味着,这些JAR将不会包含在战争存档中。