当工件被构建为JAR时,maven范围 compile 和 provided 之间有什么区别?如果它是WAR,那么我就不会包含依赖关系 . 当它们的范围是 compile 或 provided 时,它们必须在类路径上 . 我知道 provided 依赖关系不是传递性的 - 但它只是一个区别吗?
compile
provided
来自Maven Doc:
compile这是默认范围,如果未指定,则使用 . 编译依赖项在项目的所有类路径中都可用 . 此外,这些依赖项将传播到依赖项目 . 提供这与编译很相似,但表示您希望JDK或容器在运行时提供依赖关系 . 例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类 . 此范围仅在编译和测试类路径中可用,并且不可传递 .
概括:
依赖项不可传递(如您所述)
提供的范围仅在编译和测试类路径中可用,而编译范围在所有类路径中都可用 .
提供的依赖项未打包
编译意味着您需要JAR来编译和运行应用程序 . 对于Web应用程序,作为示例,JAR将放在WEB-INF / lib目录中 . 提供意味着您需要JAR进行编译,但在运行时已经有环境提供的JAR,因此您不需要将其与应用程序打包在一起 . 对于Web应用程序,这意味着JAR文件不会放入WEB-INF / lib目录中 . 对于Web应用程序,如果应用程序服务器已提供JAR(或其功能),则使用“已提供”,否则使用“编译” .
Here is the reference.
如果您计划生成包含其所有依赖项的单个JAR文件(典型的xxxx-all.jar),则提供的范围很重要,因为此范围内的类不会是生成的JAR中的包 .
有关更多信息,请参阅maven-assembly-plugin
以下是所有受支持的依赖项的简要说明(来源maven doc)
这是默认范围,如果未指定,则使用此范围 . 编译依赖项在项目的所有类路径中都可用 . 此外,这些依赖项将传播到依赖项目 .
这很像compile,但表示您希望JDK或容器在运行时提供依赖性 . 例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类 . 此范围仅在编译和测试类路径中可用,并且不可传递 .
此范围表示编译不需要依赖项,但是用于执行 . 它位于运行时和测试类路径中,但不是编译类路径 .
此范围表示正常使用应用程序不需要依赖关系,并且仅适用于测试编译和执行阶段 . 此范围不具有传递性 .
此范围与提供的类似,只是您必须提供明确包含它的JAR . 工件始终可用,不会在存储库中查找 .
仅在节中的类型为pom的依赖项上支持此范围 . 它指示要使用指定POM部分中的有效依赖项列表替换的依赖项 . 由于它们被替换,具有导入范围的依赖性实际上不参与限制依赖性的传递性 .
编译
如果它是普通jar,请不要将此依赖项添加到最终jar中;但如果最后一个jar是一个jar(例如,可执行jar),请将此jar添加到jar中
提供
依赖关系将在运行时环境中可用,因此在任何情况下都不要添加此依赖关系;甚至不在单 jar (即可执行的 jar 等)
对于jar文件,如果在maven-jar-plugin配置中将addClassPath设置为true,则区别在于jar中包含的MANIFEST.MF文件中列出的类路径 . 'compile'依赖项将出现在清单中,'提供'依赖项不会出现 .
我的一个烦恼是,这两个词应该具有相同的时态 . 编译和提供,或编译和提供 .
6 回答
来自Maven Doc:
概括:
依赖项不可传递(如您所述)
提供的范围仅在编译和测试类路径中可用,而编译范围在所有类路径中都可用 .
提供的依赖项未打包
Here is the reference.
如果您计划生成包含其所有依赖项的单个JAR文件(典型的xxxx-all.jar),则提供的范围很重要,因为此范围内的类不会是生成的JAR中的包 .
有关更多信息,请参阅maven-assembly-plugin
以下是所有受支持的依赖项的简要说明(来源maven doc)
编译
这是默认范围,如果未指定,则使用此范围 . 编译依赖项在项目的所有类路径中都可用 . 此外,这些依赖项将传播到依赖项目 .
提供
这很像compile,但表示您希望JDK或容器在运行时提供依赖性 . 例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类 . 此范围仅在编译和测试类路径中可用,并且不可传递 .
运行时
此范围表示编译不需要依赖项,但是用于执行 . 它位于运行时和测试类路径中,但不是编译类路径 .
测试
此范围表示正常使用应用程序不需要依赖关系,并且仅适用于测试编译和执行阶段 . 此范围不具有传递性 .
系统
此范围与提供的类似,只是您必须提供明确包含它的JAR . 工件始终可用,不会在存储库中查找 .
import(仅在Maven 2.0.9或更高版本中可用)
仅在节中的类型为pom的依赖项上支持此范围 . 它指示要使用指定POM部分中的有效依赖项列表替换的依赖项 . 由于它们被替换,具有导入范围的依赖性实际上不参与限制依赖性的传递性 .
如果它是普通jar,请不要将此依赖项添加到最终jar中;但如果最后一个jar是一个jar(例如,可执行jar),请将此jar添加到jar中
依赖关系将在运行时环境中可用,因此在任何情况下都不要添加此依赖关系;甚至不在单 jar (即可执行的 jar 等)
对于jar文件,如果在maven-jar-plugin配置中将addClassPath设置为true,则区别在于jar中包含的MANIFEST.MF文件中列出的类路径 . 'compile'依赖项将出现在清单中,'提供'依赖项不会出现 .
我的一个烦恼是,这两个词应该具有相同的时态 . 编译和提供,或编译和提供 .