我面前有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
范围非常有用,特别是在 Web 应用程序中。例如,您的类路径中需要存在 servlet-api.jar
才能编译您的项目,但不需要它来打包 servlet-api.jar
文件与你的 war
。通过提供
范围,可以实现这一要求。
Gradle java
插件中没有定义名为 provided
的范围。也不在 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
都是运行您的项目所必需的。生产环境中的项目存档。一般来说,生产环境中需要的所有依赖项都称为运行时
依赖项。
在Gradle官方documentation ,它说运行时
依赖项是“生产类在运行时所需的依赖项。默认情况下,还包括编译时依赖项。” .
现在,如果您已经读到这里,那么您已经知道 provided
是一个 compile
依赖项,我们不希望它出现在 >运行时
依赖项(基本上,我们不希望它与项目存档一起打包)。
以下是提供
和运行时
范围的说明。这里,compile
指的是编译项目需要的依赖,non-compile
指的是项目编译不需要的依赖。
关于java - Gradle 中“提供”的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57066952/