首页 文章

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

提问于
浏览
208

当工件被构建为JAR时,maven范围 compileprovided 之间有什么区别?如果它是WAR,那么我就不会包含依赖关系 . 当它们的范围是 compileprovided 时,它们必须在类路径上 . 我知道 provided 依赖关系不是传递性的 - 但它只是一个区别吗?

6 回答

  • 8

    来自Maven Doc

    compile这是默认范围,如果未指定,则使用 . 编译依赖项在项目的所有类路径中都可用 . 此外,这些依赖项将传播到依赖项目 . 提供这与编译很相似,但表示您希望JDK或容器在运行时提供依赖关系 . 例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类 . 此范围仅在编译和测试类路径中可用,并且不可传递 .

    概括:

    • 依赖项不可传递(如您所述)

    • 提供的范围仅在编译和测试类路径中可用,而编译范围在所有类路径中都可用 .

    • 提供的依赖项未打包

  • 243

    编译意味着您需要JAR来编译和运行应用程序 . 对于Web应用程序,作为示例,JAR将放在WEB-INF / lib目录中 . 提供意味着您需要JAR进行编译,但在运行时已经有环境提供的JAR,因此您不需要将其与应用程序打包在一起 . 对于Web应用程序,这意味着JAR文件不会放入WEB-INF / lib目录中 . 对于Web应用程序,如果应用程序服务器已提供JAR(或其功能),则使用“已提供”,否则使用“编译” .

    Here is the reference.

  • 234

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

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

  • 12

    以下是所有受支持的依赖项的简要说明(来源maven doc

    编译

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

    提供

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

    运行时

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

    测试

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

    系统

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

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

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

  • 3

    编译

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

    提供

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

  • 13

    对于jar文件,如果在maven-jar-plugin配置中将addClassPath设置为true,则区别在于jar中包含的MANIFEST.MF文件中列出的类路径 . 'compile'依赖项将出现在清单中,'提供'依赖项不会出现 .

    我的一个烦恼是,这两个词应该具有相同的时态 . 编译和提供,或编译和提供 .

相关问题