maven范围编译和JAR打包之间的区别

ems*_*tol 246 jar maven

maven范围compileprovided何时将工件构建为JAR 之间有什么区别?如果它是WAR,我明白 - 工件将包含在WEB-INF/lib中或不包含在WEB-INF/lib中.但是在JAR的情况下它并不重要 - 不包括依赖性.当它们的范围是compile或时,它们必须在类路径上provided.我知道provided依赖关系不是传递性的 - 但它只是一个区别吗?

Jac*_*cob 277

来自Maven Doc:

  • 这是默认范围,如果未指定,则使用此范围.编译依赖项在项目的所有类路径中都可用.此外,这些依赖项将传播到依赖项目.

  • 提供

    这很像compile,但表示您希望JDK或容器在运行时提供依赖性.例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类.此范围仅在编译和测试类路径中可用,并且不可传递.

概括:

  • 依赖关系不是传递的(正如你所提到的)
  • 提供的范围仅在编译和测试类路径上可用,而编译范围在所有类路径中都可用.
  • 提供的依赖项未打包

  • 是的我知道.但我在思考"JAR包装"背景下的范围差异.Maven doc没有提及它.我使用Maven已经有一段时间了,但我已经问过自己了:)所以似乎在`JAR包装`上下文中,`compile`和`provided`之间没有任何区别(除了依赖转换).我对吗? (3认同)
  • @Jacob是什么意思"而编译范围可用于*所有类路径*."? (3认同)
  • @emstol 回到你最初的问题,你是对的,在 JAR 的情况下,依赖项没有打包在 JAR 本身中。但是在 maven 中,JAR 打包意味着您希望将其用作库。一旦你将它导入到其他一些 maven 项目中,如果范围是 `compile`,传递依赖将被引入,如果范围是 `provided`,则不会。 (3认同)
  • 我认为“不传递”是这里的一个大问题。因为依赖地狱是开发人员经常面临的问题,而提供的范围可以防止它发生,并且与其他版本混淆是至关重要的。 (2认同)
  • 我认为区别在于包装阶段。通过编译,它会包含最终war或jar中的jar(例如spring boot可执行jar),并且提供的结果可能不是。因为提供的jar可能是web容器提供的(比如放在ext lib文件夹中),如果不依赖于其他作用域、编译、运行时,则不在war包中。 (2认同)

Owe*_*Cao 276

编译意味着您需要JAR来编译和运行应用程序.对于Web应用程序,作为示例,JAR将放在WEB-INF/lib目录中.

提供意味着您需要JAR进行编译,但在运行时,环境已经提供了JAR,因此您不需要将其与应用程序打包在一起.对于Web应用程序,这意味着JAR文件不会放入WEB-INF/lib目录中.

对于Web应用程序,如果应用程序服务器已提供JAR(或其功能),则使用"已提供",否则使用"编译".

这是参考.

  • 你没有回答OP的问题?'_使用maven范围编译时有什么区别,并且当工件被构建为JAR时提供**?_'请注意,作者明确表示他们知道包装为战争时的区别. (9认同)

小智 20

以下是所有支持的依赖项的简介(源maven doc)

这是默认范围,如果未指定,则使用此范围.编译依赖项在项目的所有类路径中都可用.此外,这些依赖项将传播到依赖项目.

提供

这很像compile,但表示您希望JDK或容器在运行时提供依赖性.例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类.此范围仅在编译和测试类路径中可用,并且不可传递.

运行

此范围表示编译不需要依赖项,但是用于执行.它位于运行时和测试类路径中,但不是编译类路径.

测试

此范围表示正常使用应用程序不需要依赖关系,并且仅可用于测试编译和执行阶段.此范围不具有传递性.

系统

此范围与提供的类似,只是您必须提供明确包含它的JAR.工件始终可用,并且不会在存储库中查找.

导入(仅适用于Maven 2.0.9或更高版本)

此范围仅在该部分中类型为pom的依赖项上受支持.它指示要使用指定POM部分中的有效依赖项列表替换的依赖项.由于它们被替换,具有导入范围的依赖性实际上不参与限制依赖性的传递性.


jfc*_*edo 16

如果您计划生成包含其所有依赖项的单个JAR文件(典型的xxxx-all.jar),则提供的范围很重要,因为此范围内的类不会是生成的JAR中的包.

有关更多信息,请参阅maven-assembly-plugin

  • 提供依赖项==>依赖项将不会被打包. (6认同)
  • 当您使用 `maven-assembly-plugin` 打包时,OP 混淆显然得到解决,有趣的是,最高投票的答案没有提到它。 (3认同)

小智 9

在类路径中可用,如果是普通jar,请不要将此依赖项添加到最终jar中; 但如果最后一个jar是一个jar(例如,可执行jar),请将此jar添加到jar中

  • 提供

依赖关系将在运行时环境中可用,因此在任何情况下都不要添加此依赖关系; 甚至不在单罐(即可执行的jar等)