maven打jar包知识-运行包、依赖包、传递性
在使用Java和Maven等工具时,经常会遇到jar运行包和依赖包的概念。以下是两者的详细解释:
一、jar运行包
- 可执行性:jar运行包包含了程序的入口点(如main方法),因此可以直接通过命令行或IDE运行。
- 自包含性:它通常包含了程序运行所需的所有依赖项,因此无需额外的配置即可运行。
- 结构:解压后,通常包含BOOT-INF/classes/目录(存放程序自身的编译类文件)、BOOT-INF/lib/目录(存放程序依赖的其他jar包)以及META-INF/MANIFEST.MF文件(包含程序的元数据,如入口类等)。
二、jar依赖包
-
非可执行性:jar依赖包不包含程序的入口点,因此不能直接运行。
-
依赖性:它通常被其他项目作为依赖项引入,以提供特定的功能或库。
-
结构:解压后,通常直接包含类的编译文件(如.class文件),以及可能的资源文件和元数据文件(如META-INF/目录下的文件)。然而,与jar运行包不同,它通常不包含其他依赖项的jar包。
三、区别与联系
-
功能:jar运行包包含了程序的入口点和所有依赖项,可以直接运行;而jar依赖包则提供了特定的功能或库,通常被其他项目作为依赖项引入。
-
结构:jar运行包包含BOOT-INF/和META-INF/等特定目录;而jar依赖包则通常只包含类的编译文件和可能的资源文件。
-
用途:jar运行包用于分发和部署完整的Java应用程序;而jar依赖包则用于在Java项目中提供共享的功能或库。
-
依赖关系:在某些情况下,一个jar运行包可能也包含其他jar依赖包作为它的依赖项。
-
转换:在某些构建工具(如Maven)中,可以通过特定的配置和插件将jar依赖包打包到jar运行包中,从而创建一个自包含的、可运行的jar包。
综上所述,jar运行包和依赖包在Java开发中扮演着不同的角色,它们各自具有独特的特点和用途。理解这些概念和它们之间的区别与联系,有助于更好地管理Java项目的依赖关系和构建过程。
四、依赖传递
在Maven中,依赖的作用域(scope)定义了依赖在不同阶段的可见性和使用范围。关于哪些作用域不是传递性的,以下是具体的解释:
4.1 非传递性的作用域
- provided
定义:provided依赖在编译和测试阶段可见和可用,但在运行阶段由JDK或容器提供,不会被打包到最终的构建产物中。
非传递性:provided范围的依赖不会被传递到依赖于该项目的其他项目中。这是因为该依赖被认为是在运行环境中已经提供的,所以不需要被包含在最终的构建产物中。 - test
定义:test依赖仅在测试阶段可见和可用,不会被打包到最终的构建产物中。
非传递性:test范围的依赖同样不会被传递到依赖于该项目的其他项目中。这些依赖仅用于测试目的,与项目的实际运行无关。 - system(不推荐使用)
定义:system范围类似于provided,但需要显式指定依赖的路径。它通常用于那些没有托管在Maven中央仓库或私有仓库中的依赖。
非传递性:由于system范围的依赖需要显式指定路径,并且通常不被推荐在生产环境中使用,因此它们也不会被传递到依赖于该项目的其他项目中。
4.2 传递性的作用域
与上述非传递性作用域相对的是传递性作用域,如compile和runtime。这些作用域中的依赖会被传递到依赖于该项目的其他项目中,因为它们对于项目的运行是必要的。
- compile:默认的依赖作用域,表示依赖在编译、测试、运行等阶段都可见和可用。这些依赖会被打包到最终的构建产物中,并且会传递到依赖于该项目的其他项目中。
- runtime:表示依赖仅在运行阶段可见和可用,但不会被打包到最终的构建产物中的说法不完全准确。实际上,对于需要打包成可运行jar或war的应用来说,runtime范围的依赖通常会被包含在最终的构建产物中,以确保应用能够正确运行。同时,这些依赖也会被传递到依赖于该项目的其他项目中(尽管在传递过程中可能会受到其他因素的影响,如依赖冲突和版本不一致等)。
综上所述,Maven中的provided、test和system(不推荐使用)作用域是非传递性的。在选择依赖作用域时,需要根据项目的具体需求和场景进行合理选择,以确保项目的正确构建和运行。