Maven

Maven的作用

Maven是一款管理和构建Java项目的工具,作用有以下三点:

  1. 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。
  2. 统一项目结构:提供标准、统一的项目结构。
  3. 项目构建:标准跨平台 (Linux、WindowsMacos)的自动化项目构建方式。

Maven坐标
Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置,使用坐标来定义项目或引入项目中需要的依赖。

Maven坐标主要组成

  • groupld: 定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.XXX)
  • artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
  • version:定义当前项目版本号

依赖管理

配置依赖

依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。

配置:

  • 1.在 pom.xml 中编写 <dependencies> 标签
  • 2. 在<dependencies> 标签中 使用 <dependency> 引入坐标
  • 3.定义坐标的 groupld,artifactld,version
  • 4.点击刷新按钮,引入最新加入的坐标

依赖传递

依赖具有传递性

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
  • 可选依赖(不透明):声明某个依赖项是可选的,这意味着它不是必需的,如果用户不明确地指定,项目仍然可以正常构建和运行。可选依赖通常用于在运行时提供额外的功能,但不是应用程序的核心部分。

<optional>默认为false

  • 排除依赖(不需要):排除依赖指主动断开依赖的资源,被排除的资源无需指定版本

可选依赖:不想被别人用;排除依赖:我不想用别人的

依赖传递冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

Maven中的循环依赖如何解决? 

循环依赖是指两个或多个模块之间存在相互依赖的情况,这可能导致Maven构建失败。(IDEA可以通过图像化界面定位循环依赖)

因为Maven结构是自下而上的,被依赖的包将会提前于使用其的包被maven打包,因此A引用了B,B引用了A,Maven不知道要将哪个包提前打包,就会报错。

GPT:

  1. 重新组织项目结构: 重新考虑项目的模块划分,看看是否可以通过将一些代码移动到新的模块中来解决循环依赖。这可能需要对项目进行较大的结构调整。(1.比如A和B互相依赖,同时它们都依赖C,那么可以将B和A相互依赖的那部分代码,移动到工程C里,这样一来,A和B相互之间都不依赖,只继续依赖C,也可以消除循环依赖 2.比如A和B互相依赖,那么可以将B依赖A的那部分代码,移动到工程B中,这样一来,B就不需要继续依赖A,只要A依赖B就可以了,从而消除循环依赖

  2. 接口和实现分离: 尽量将接口和实现分离到不同的模块中。这样,如果一个模块依赖于接口,而另一个模块依赖于实现,就可以避免直接的循环依赖。

  3. 抽象模块: 创建一个额外的模块,其中包含两个模块共享的接口或抽象类。这样,两个原始模块可以分别依赖于这个抽象模块,而不会直接相互依赖。

  4. 使用Maven插件: Maven有一些插件,如maven-dependency-plugin,可以用于分析依赖关系。这些插件可以帮助你识别循环依赖并采取措施解决它们。(比如A依赖B,B依赖C,C依赖A的情况。这个插件提供了一种规避措施,即临时地将工程A、B、C合并成一个中间工程,编译出临时的模块D。然后A、B、C再分别依赖临时模块D进行编译,这种方法可以解决无法构建的问题,但是只是一个规避措施,循环依赖依然存在)

  5. 依赖调整: 检查项目的依赖关系,看看是否有可能通过升级或降级某些依赖项版本来解决问题。

  6. 使用<exclusions>pom.xml中使用<exclusions>标签排除不需要的依赖项,以减少循环依赖的可能性。

依赖范围

依赖的jar包,默认情况下,可以在任何地方使用。可以通过 <scope>...</ scope > 设置其作用范围作用范围:

  • 主程序范围有效。(main文件夹范围内)
  • 测试程序范围有效。(test文件夹范围内)
  • 是否参与打包运行。(package指令范围内)

<scope>import</scope>

这是project-B的pom.xml
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>project-A</groupId>
        <artifactId>project-A</artifactId>
        <version>1.0</version>
        <scope>import</scope>
      </dependency>
      ...
    </dependencies>
  </dependencyManagement>

这是 Maven 的一种依赖管理机制,确切地说是继承机制。通过在项目B的<dependencyManagement>中引入项目A的依赖定义,项目B实际上继承了项目A的版本管理信息,但并不会直接引入项目A的依赖。这就相当于将A中定义的所有<dependencies>全部复制粘贴到了项目B的pom.xml中。由于是“复制粘贴”,所以不是继承关系。

<type>pom</type>

在 Maven 的 <dependency> 元素中,<type> 元素用于指定依赖项的类型。当 <type> 的值为 "pom" 时,表示这个依赖项实际上是一个 Maven 项目(POM 文件),而不是普通的 JAR 文件。

在实际应用中,通常使用 <type>pom</type> 的情况是在父项目(parent project)中,通过声明子模块(子项目)的 POM 文件。通过这种方式,父项目可以管理和传递一些通用的配置和依赖给子模块,而不需要引入子模块的实际代码。

在每个子模块的 POM 文件中,可能包含 <packaging>pom</packaging> 表示它是一个 POM 项目,而不是普通的 JAR 项目。

通过这样的配置,Maven 在构建时会将子模块的 POM 文件作为一个整体来处理,而不会尝试去编译它们的源代码。这样有助于组织和管理大型的项目结构。

总的来说,<type>pom</type> 主要用于声明某个依赖项是一个 Maven 项目的 POM 文件,而不是传统的 Java 类库。

生命周期

Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。

Maven中有3套相互独立的生命周期:

  • clean:清理工作。
  • default: 核心工作,如: 编译、测试、打包、安装、部署等
  • site:生成报告、发布站点等

生命周期阶段

  • clean: 移除上一次构建生成的文件
  • compile: 编译项目源代码
  • test: 使用合适的单元测试框架运行测试(junit)
  • package: 将编译后的文件打包,如: jar、war等
  • install: 安装项目到本地仓库

在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。

生命周期/阶段在运行时实际是由插件完成相应的工作。

分模块设计与开发

什么是分模块设计?

将项目按照功能拆分成若干个子模块

为什么要分模块设计?

方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享

注意事项:分模块设计需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分

继承与聚合

继承

  1. 创建maven模块,该工程为父工程,设置打包方式<packaging>pom</packaging>(默认jar)。
  2. 在子工程的pom.xml文件中,配置继承关系。
  3. 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。

使用Springboot有一个统一的父工程,Maven不支持多继承,但支持多重继承

注意事项:

  • 在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的。
  • relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)。
  • 若父子工程都配置了同一个依赖的不同版本,以子工程的为准。
  • 配置maven打war包时,忽略web.xml检查

版本锁定

<dependencyManagement> 与 <dependencies>的区别是什么?

  • <dependencies>是直接依赖在父工程配置了依赖,子工程会直接继承下来
  • <dependencyManagement> 是统一管理依赖版本不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)

聚合

聚合:将多个模块组织成一个整体,同时进行项目的构建
聚合工程:一个不具有业务功能的“空”工程(有且仅有一个pom文件)
作用:快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)

maven中可以通过<modules>设置当前聚合工程所包含的子模块名称。

注意事项:
聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。

作用:

  • 聚合用于快速构建项目
  • 继承用于简化依赖配置、统一管理依赖

相同点:

  • 聚合与继承的pom.xm文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
  • 聚合与继承均属于设计型模块,并无实际的模块内容

不同点:

  • 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些
  • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

在你提供的配置中,<build> 标签下的 <plugins> 子标签指定了 Maven 插件的配置。在这里,spring-boot-maven-plugin 插件被配置为构建插件,这个插件可以帮助你在构建过程中将应用程序打包成一个独立的可执行文件,使得你可以方便地部署和运行 Spring Boot 应用程序。该插件还提供了一个内置的应用程序启动器,可以直接运行 Spring Boot 应用程序,无需传统的应用服务器。通过这个插件,你可以使用命令行或者 Maven 插件的方式来启动你的 Spring Boot 应用程序,方便地进行开发和调试。

一旦你在 pom.xml 文件中添加了这个配置,Maven 在构建项目时就会执行相关的插件功能,例如打包可执行 JAR 文件或启动 Spring Boot 应用程序。

私服

没用过,用到了再补充

实习了是没用过

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值