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

时间:2011-07-11 07:24:57

标签: maven jar

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

8 个答案:

答案 0 :(得分:261)

  

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

     

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

     

对于网络应用,如果应用服务器已经提供了JAR(或其功能),则使用“提供”,否则使用“编译”。

Here is the reference.

答案 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。工件始终可用,不会在存储库中查找。

import(仅在Maven 2.0.9或更高版本中可用)

此范围仅在部分中类型为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文件中包含所有依赖项,因为这些软件包或应用程序本身可以提供其他依赖项。