当工件构建为JAR时,maven范围compile
和provided
之间有什么区别?如果它是WAR,我明白 - 工件将包含在WEB-INF / lib中或不包含在WEB-INF / lib中。但是在JAR的情况下它并不重要 - 不包括依赖性。当它们的范围为compile
或provided
时,它们必须位于类路径中。我知道provided
依赖关系不是传递性的 - 但它只是一个区别吗?
答案 0 :(得分:261)
编译意味着您需要JAR来编译和运行应用程序。对于Web应用程序,作为示例,JAR将放在WEB-INF / lib目录中。
提供意味着您需要使用JAR进行编译,但在运行时已经有环境提供的JAR,因此您不需要将其与应用程序打包在一起。对于Web应用程序,这意味着JAR文件不会放入WEB-INF / lib目录中。
对于网络应用,如果应用服务器已经提供了JAR(或其功能),则使用“提供”,否则使用“编译”。
答案 1 :(得分:259)
来自Maven Doc:
编译
这是默认范围,如果未指定,则使用此范围。编 依赖项在项目的所有类路径中都可用。 此外,这些依赖项将传播到依赖项目。
<强>提供强>
这很像编译,但表示你期望JDK或者 容器在运行时提供依赖性。例如,何时 您可以为Java Enterprise Edition构建Web应用程序 设置对Servlet API和相关Java EE API的依赖 提供范围是因为Web容器提供了这些类。这个 scope仅在编译和测试类路径上可用,并且是 不可传递。
回顾:
答案 2 :(得分:17)
以下是所有受支持的依赖项(来源maven doc)
的简介这是默认范围,如果未指定,则使用此范围。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。
这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。
此范围表示编译不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。
此范围表示正常使用应用程序不需要依赖关系,并且仅适用于测试编译和执行阶段。这个范围不具有传递性。
此范围与提供的类似,只是您必须提供明确包含它的JAR。工件始终可用,不会在存储库中查找。
此范围仅在部分中类型为pom的依赖项上受支持。它指示要使用指定POM部分中的有效依赖项列表替换的依赖项。由于它们被替换,具有导入范围的依赖性实际上并不参与限制依赖的传递性。
答案 3 :(得分:15)
如果你计划生成一个包含所有依赖项的JAR文件(典型的xxxx-all.jar),那么提供的范围很重要,因为这个范围内的类不会成为包由此产生的JAR。
有关更多信息,请参阅maven-assembly-plugin
答案 4 :(得分:9)
- 编译
在课程路径中可用,如果是正常的jar,请不要将此依赖项添加到最终jar中;但是如果最终的jar是一个jar(例如,可执行的jar),那么将这个jar添加到jar中
- 提供
依赖关系将在运行时环境中提供,因此在任何情况下都不要添加此依赖关系;甚至不在单罐(即可执行的罐子等)
答案 5 :(得分:3)
For a jar file, the difference is in the classpath listed in the MANIFEST.MF file included in the jar if addClassPath is set to true in the maven-jar-plugin configuration. 'compile' dependencies will appear in the manifest, 'provided' dependencies won't.
One of my pet peeves is that these two words should have the same tense. Either compiled and provided, or compile and provide.
答案 6 :(得分:0)
当您将maven范围设置为provided
时,这意味着当插件运行时,实际使用的依赖项版本将取决于您已安装的Apache Maven的版本。
答案 7 :(得分:0)
如果jar文件像可执行的spring boot jar文件一样,则所有依赖项的范围必须为compile
才能包括所有jar文件。
但是,如果jar文件用于其他软件包或应用程序,则不需要在jar文件中包含所有依赖项,因为这些软件包或应用程序本身可以提供其他依赖项。