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

Maven进阶——坐标、依赖、仓库

目录

1.pomxml文件

2. 坐标

2.1 坐标的概念

2.2 坐标的意义

2.3 坐标的含义

2.4 自己项目的坐标

2.5 第三方项目坐标 

3. 依赖

3.1 依赖的意义

3.2 依赖的使用

3.3 第三方依赖的查找方法

3.4 依赖范围

3.5 依赖传递和可选依赖

3.5.1 依赖传递

 3.5.2 依赖范围对传递依赖的影响

3.5.3 依赖阻断

 ​​​​​​​3.5.4 可选依赖

4. 仓库

​​​​​​​4.1 仓库的概念

4.2 本地仓库

​​​​​​​4.3 中央仓库

 ​​​​​​4.4 依赖搜索顺序


1.pomxml文件

就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

2. 坐标

2.1 坐标的概念

在 Maven 中坐标是构件的唯一标识,Maven 坐标的元素包括 groupIdartifactIdversion、packaging、classifier。上述5个元素中,groupId、artifactId、version 是必须定义的,packaging 是可选的 ( 默认为 jar )。

2.2 坐标的意义

  • Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
  • 拥有了统一规范,就可以把查找工作交给机器

2.3 坐标的含义

groupId:组织标识,一般为:公司网址的反写+项目名

artifactId:项目名称,一般为:项目名-模块名

version:版本号 形式为0.0.1-SNAPSHOT:

                第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号

                SNAPSHOT -- 快照版本(√),ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本(√),GA -- 正式发布

packaging:打包的方式,如:pom(只做依赖管理,不写代码), jar, maven-plugin, ejb, war(带有前端页面的), ...

clissifier:用来帮助定义构件输出的一些附属构件。

2.4 自己项目的坐标

2.5 第三方项目坐标 

3. 依赖

3.1 依赖的意义

       当编写Java代码时,我们总是需要一些库,例如,做单元测试我们需要JUnit库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。 保持项目最新的库JAR文件的正确版本不是一个容易的任务。

        每个外部JAR可能还依赖于其他外部JAR文件等。以递归方式下载所有这些外部依赖JAR文件并确保下载正确的版本是一项巨大的任务。当项目越来越大,我们将需要越来越多的外部依赖。

       Maven将下载它们并将它们放在您的本地Maven存储库中。我们可以在POM文件中dependencies元素内指定依赖关系。

3.2 依赖的使用

      例如我们的项目需要进行单元测试,则需要使用到junit-4.9.jar包,使用maven引用该依赖的方式如下:

属性说明:

  • 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
    • scope: 控制该依赖包在什么情况下会被加到 classpath 中;

3.3 第三方依赖的查找方法

        我们在不确定所需引用的第三方依赖包的坐标时,通过maven的中央仓库进行查找,网址: https://mvnrepository.com/;

        以mybatis举例:

 引入成功。

3.4 依赖范围

Maven项目在开发工程中有三套classpath

  • 主代码:main下面的都是主代码在编译的时候的依赖
  • 测试代码:test下是测试代码编译的时候的依赖
  • 运行时:main代码在运行的时候对包的依赖

依赖范围的使用,通过在引用第三方依赖时的<scope></scope>标签进行设置,例如:

 

共 6 种 scope,包括:compileprovidedruntimetest、system、import。例如上图的junit,只在测试中使用,则选择test即可,默认为compile

  • Compile:编译依赖范围。默认使用此依赖范围,其下的maven依赖,对于编译,测试,运行classpath都有效。
  • Test:测试依赖范围。只对测试classpath有效,编译主代码或运行项目时无法使用此依赖。典型例子如junit。
  • Provided:已提供依赖范围。其对于编译与测试classpath有效,运行时无效。如在web开发时,只有在编译和测试时才用到servlet-api,将其设置为此范围,在运行时servlet-api由web容器提供,无须依赖。并且在打war包时,此范围的依赖不会打在WEB-INF/lib下。
  • Runtime:运行时依赖范围。与provided相对,运行时classpath有效。典型例子如jdbc编写是接口规范运行是提供具体实现类需要jar包

3.5 依赖传递和可选依赖

3.5.1 依赖传递

应用场景:

        第一直接依赖: HelloFriend项目依赖Hello项目

        第二直接依赖: MakeFriend项目依赖HelloFriend项目

 makeFriend项目只依赖了HelloFriend项目,但同时也把Hello项目依赖了进来。

 ​​​​​​​3.5.2 依赖范围对传递依赖的影响

  传递依赖是会受到依赖范围的影响的,具体来看结果如下:

3.5.3 依赖阻断

      例如我们在HelloFriend项目里面的Hello依赖处添加该配置 :

 <optional>true</optional>


    我们可以看到makeFriend项目现在只引入了HelloFriend的依赖而没有引入Hello的依赖:

依赖阻断表示,当HelloFriend被其他项目依赖时,不传递Hello的依赖至依赖于HelloFriend的项目。 

 ​​​​​​​3.5.4 可选依赖

       如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖,如图: 

      可以看到,排除Hello后,依赖中就不会引入Hello。

4. 仓库

​​​​​​​4.1 仓库的概念

        在 Maven 的术语中,仓库是一个位置(place)。Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

        在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

仓库的类型有:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

4.2 本地仓库

        Maven 的本地仓库在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

        默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %Maven_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

​​​​​​​4.3 中央仓库

        Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。

中央仓库的关键概念:

  • 这个仓库由 Maven 社区管理。
  • 不需要配置。
  • 需要通过网络才能访问。

 ​​​​​​4.4 依赖搜索顺序

http://www.lryc.cn/news/466906.html

相关文章:

  • Android中的内存泄漏及其检测方式
  • 【雷电模拟器命令合集操作大全】官方文档整理贴
  • redis的配置文件解析
  • Python中的元组和列表
  • 【AI战略思考7】粮草筹集完毕和我的朋友分类
  • 科大讯飞AI开发者大赛颁奖典礼,万码优才荣获前三甲!
  • Redis 哨兵机制
  • linux-磁盘io情况、性能排查
  • NC 单据模板自定义项 设置参照,比如部门参照、自定义参照等
  • table-cascade 使用
  • Android SELinux——策略文件配置结构(八)
  • 【数据结构与算法】队列——数据世界中的“有序使者”
  • yolov11 部署 TensorRT,预处理和后处理用 C++ cuda 加速,速度快到飞起
  • 国际期货收费行情源CTP推送式/期货配资软件开发对接行情源的技术性说明
  • 上拉电阻和下拉电阻在电路中的作用(一)
  • 怎么轻松把图片存入二维码?图片生成二维码的简单3步技巧
  • perl双引号内字符串的反斜线转义
  • 【编程语言】Kotlin快速入门 - 伴生对象与懒加载
  • 三、数据聚合和函数
  • Golang | Leetcode Golang题解之第500题键盘行
  • 如何实现金蝶商品数据集成到电商系统的SKU
  • 100种算法【Python版】第4篇——回溯法
  • R语言机器学习算法实战系列(九)决策树分类算法 (Decision Trees Classifier)
  • 听泉鉴宝在三个月前已布局商标注册!
  • vscode设置特定扩展名文件的打开编码格式
  • Linux——动态卷的管理
  • 第三季度中国游戏市场收入创历史新高;京东物流与淘宝天猫达成合作;YouTube 上线“用相机拍摄”标签....|网易数智日报
  • 智慧城管综合管理系统源码,微服务架构,基于springboot、vue+element+uniapp技术开发,支持二次开发
  • 2024Flutter面试题
  • MySQL-23.多表查询-内连接