Java ';提供';梯度依赖
我面前有Java ';提供';梯度依赖,java,gradle,dependency-management,Java,Gradle,Dependency Management,我面前有build.gradle,有些依赖项声明为提供,但在中,我看不到此依赖项范围 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:javolu
build.gradle
,有些依赖项声明为提供
,但在中,我看不到此依赖项范围
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中提供的和运行时依赖范围之间有什么区别
提供的范围是什么
假设编译代码需要一个jar
,但该jar存在于生产环境库集合中。这样,您就不需要将jar与项目档案打包在一起。为了支持这一需求,Maven提供了一个名为的作用域
。如果将任何jar依赖项声明为提供的,
,那么在编译过程中,这个jar将出现在类路径中,但不会与项目归档一起打包
提供的范围非常有用,特别是在web应用程序中。例如,servlet api.jar
需要存在于类路径中以编译项目,但您不需要将servlet api.jar
文件与war
打包在一起。有了提供的范围,就可以实现这一要求
Gradlejava
插件中没有定义名为的范围
。也不在war
或android
插件中。如果要在项目中使用提供的
范围,则必须在build.gradle
文件中定义它。以下是在gradle中声明提供的范围的代码片段:
configurations {
provided
}
sourceSets {
main { compileClasspath += configurations.provided }
}
现在,你的第二个问题:
Gradle中提供的和运行时依赖范围之间有什么区别
为了首先回答这个问题,我将定义compile
dependency<代码>编译
依赖项是依赖项,它们是编译代码所必需的。现在想象一下,如果您的代码使用名为X
的库,那么必须将X
声明为编译时依赖项。还可以想象X
在内部使用另一个库Y
,并且您声明Y
作为运行时依赖项
在编译过程中,Gradle会将X
添加到类路径中,但不会添加Y
。因为,Y
不是编译所必需的。但它会将X
和Y
与您的项目归档一起打包,因为在生产环境中运行项目归档需要X
和Y
。通常,生产环境中需要的所有依赖项都称为运行时
依赖项
在Gradle official中,它说运行时
依赖项是“生产类在运行时所需的依赖项。默认情况下,还包括编译时依赖项。”
现在,如果您已经阅读了本文,那么您已经知道,提供的
是一个编译
依赖项,我们不希望它出现在运行时
依赖项中(基本上,我们不希望它与项目归档一起打包)
下面是提供的和运行时范围的说明。这里,compile
指的是编译项目所需的依赖项,non-compile
指的是项目编译不需要的依赖项
从gradle 2.12开始,您可以使用compileOnly选项
看
为了进一步澄清,从最新版本开始,Gradle 5.5已经有了可编译的
(与提供的
相同)和仅运行时的
选项。新的默认“编译和运行时”选项是implementation
根据最新的gradle版本更新答案
来自gradle的官方文件,链接如下:
反对意见
不应再使用编译和运行时配置声明依赖项。编译和运行时的使用
不鼓励Java生态系统插件中的配置
从Gradle 3.4开始。
应使用实现、api、compileOnly和runtimeOnly配置来声明依赖项以及compileClasspath和
用于解决依赖关系的运行时类路径配置。
更重要的是,最近发布的Gradle 7.0版本中删除了编译依赖项配置
如果您尝试在Gradle 3.4+项目中使用compile,您将收到如下警告:
此版本中使用了不推荐的Gradle功能,因此
与Gradle 7.0不兼容。使用“–警告模式全部”显示
个别弃用警告
对于依赖项,您应该始终使用实现而不是编译,并且使用runtimeOnly而不是runtime
战争插件
War插件扩展了Java插件,增加了对组装web应用程序War文件的支持。它禁用默认的JAR归档
生成Java插件并添加默认的WAR归档任务。
War插件添加了两种依赖项配置:
提供编译
提供的运行时
向providedCompile或providedRuntime添加条目将导致从war文件中排除该依赖项
如果您的源代码依赖于某些类,请使用providedCompile
用于编译
如果您将providedRuntime用于测试而不是
编译
示例:
providedCompile 'org.springframework.boot:spring-boot-starter-tomcat:1.1.6.RELEASE'
上面的JAR及其可传递依赖项仅在编译时可用,但在运行时不可用。这意味着,这些JAR将不包括在战争档案中。您是否有名为提供的配置
?我想我不明白您指的是什么类型的配置。我指的是配置中名为提供的
的条目