我前面有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
....
}这是由插件提供的吗?如果是这样的话,我如何找出这个插件属于哪个插件?
provided和runtime依赖范围在Gradle中有什么区别?
发布于 2015-06-09 12:04:56
什么是
provided范围?
假设编译代码需要一个jar,但是jar存在于生产环境库集合中。然后,您不需要将jar打包到您的项目档案中。为了支持这个需求,Maven有一个名为provided的范围。如果您将任何jar依赖声明为provided,则在编译期间这个jar将出现在您的类路径中,但不会与您的项目存档一起打包。
provided范围非常有用,特别是在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 }
}现在,你的第二个问题:
在Gradle中,提供的和运行时依赖范围之间有什么区别?
为了首先回答这个问题,我将定义compile依赖项。compile依赖项是依赖项,这是编译代码所必需的。现在,假设您的代码使用一个名为X的库,那么您必须声明X为编译时依赖项。还假设X在内部使用另一个库Y,并将Y声明为运行时依赖项。
在编译期间,Gradle将将X添加到类路径中,但不会添加Y。因为,编译不需要Y。但是它将将X和Y打包到您的项目存档中,因为在生产环境中运行项目存档需要X和Y。通常,生产环境中所需的所有依赖项都称为runtime依赖项。
在Gradle官方文档中,它说runtime依赖项是“生产类在运行时所需的依赖项,默认情况下,还包括编译时依赖项.”。
现在,如果您已经阅读了这么多,那么您已经知道provided是一个我们不希望出现在runtime依赖项中的compile依赖项(基本上,我们不希望它与项目存档一起打包)。
下面是provided和runtime作用域的说明。在这里,compile引用编译项目所需的依赖项,non-compile引用项目编译所不需要的依赖项。

发布于 2019-02-22 09:40:27
发布于 2019-07-06 04:52:55
为了进一步澄清,在最新版本中,Gradle 5.5有compileOnly (与provided相同)和runtimeOnly选项。新的默认“编译和运行时”选项是implementation。
https://stackoverflow.com/questions/30731084
复制相似问题