当前位置: 首页 > article >正文

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(不推荐使用)作用域是非传递性的。在选择依赖作用域时,需要根据项目的具体需求和场景进行合理选择,以确保项目的正确构建和运行。


http://www.kler.cn/a/385192.html

相关文章:

  • 云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO
  • JavaWeb开发9
  • 网页版五子棋——匹配模块(客户端开发)
  • 论文2—《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告
  • 【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
  • 如何快速搭建一个spring boot项目
  • 解析json导出csv或者直接入库
  • 音频内容理解
  • 爱奇艺大数据多AZ统一调度架构:打破数据孤岛,提升效率
  • 【系统架构设计师】高分论文:论软件的可用性设计
  • 如何快速搭建一个spring boot项目
  • FIPS203 后量子安全ML-KEM(标准简读)
  • .vue文件中定义变量和在引用的.ts文件中定义变量的区别
  • C++模拟真人动态生成鼠标滑动路径
  • 29种Prompt Engineering
  • 自监督学习:机器学习的未来新方向
  • Docker篇(阿里云私服)
  • 热成像手机VS传统热成像仪:AORO A23为何更胜一筹?
  • 64 mysql 的 表锁
  • 建筑安全员题库分享
  • SpringBoot启动器
  • 性能调优专题(5)之深入理解Mysql事务隔离级别与锁机制
  • 4.WebSocket 配置与Nginx 的完美结合
  • 低代码与数字化综合服务平台的建设与探索
  • 淘宝反爬虫机制的主要手段有哪些?
  • 【计算机网络篇】数据链路层(14)虚拟局域网VLAN(概述,实现机制)