java Gradle中的“提供”依赖关系

e0bqpujr  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(209)

我面前有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中的providedruntime依赖范围有何区别?

46qrfjad

46qrfjad1#

什么是provided作用域?
假设需要一个jar来编译代码,但是这个jar已经存在于生产环境库集合中,那么您就不需要将jar与项目存档一起打包,为了支持这个需求,Maven有一个名为provided的作用域,如果您将任何jar依赖项声明为provided,那么这个jar将在编译过程中出现在类路径中,但不会与项目归档一起打包。
provided作用域非常有用,特别是在Web应用程序中。例如,servlet-api.jar需要存在于您的类路径中以编译您的项目,但您不需要它来将servlet-api.jar文件与war打包在一起。使用provided作用域可以满足此要求。
名为provided的Gradle java插件中没有定义作用域。warandroid插件中也没有定义作用域。如果要在项目中使用provided作用域,则必须在build.gradle文件中定义它。以下是用于在Gradle中声明provided作用域的代码片段:

configurations {
    provided
}

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

现在,你的第二个问题:
Gradle中提供的依赖关系作用域和运行时依赖关系作用域有何区别?
为了回答这个问题,首先我将定义compile依赖项。compile依赖项是依赖项,它们是编译代码所必需的。现在想象一下,如果您的代码使用一个名为X的库,那么您必须将X声明为编译时依赖项。还想象一下,X在内部使用另一个库Y。并且声明了Y作为运行时依赖项。
在编译过程中,Gradle会将X添加到类路径中,但不会添加Y。因为编译不需要Y。但它会将XY与项目存档一起打包,因为XY对于在生产环境中运行项目存档都是必需的。生产环境中所需的所有相关性被称为runtime相关性。
在Gradle官方documentation中,runtime依赖项是“***生产类在运行时所需的依赖项。默认情况下,还包括编译时依赖项。***"。
现在,如果您已经阅读到这里,那么您已经知道provided是一个compile依赖项,我们不希望它出现在runtime依赖项中(基本上,我们不希望它与项目归档一起打包)。
下面是providedruntime作用域的说明。这里,compile指编译项目所需的依赖项,non-compile指编译项目不需要的依赖项。

q9yhzks0

q9yhzks02#

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

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

k97glaaz

k97glaaz3#

为进一步说明,自最新版本起,Gradle 5.5提供了compileOnly(与provided相同)和runtimeOnly选项。新的默认“编译和运行时”选项为implementation

wwwo4jvm

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用于测试而不是编译,请使用它。

示例:

providedCompile 'org.springframework.boot:spring-boot-starter-tomcat:1.1.6.RELEASE'

上述JAR及其传递依赖项将只在编译时可用,而在运行时不可用。这意味着,这些JAR将不会包含在战争存档中。

相关问题