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
打包在一起。有了
提供的
范围,就可以实现这一要求

Gradle
java
插件中没有定义名为
的范围
。也不在
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将不包括在战争档案中。

    您是否有名为
    提供的配置
    ?我想我不明白您指的是什么类型的配置。我指的是
    配置中名为
    提供的
    的条目