Maven详解

1. Maven简介

​ Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具**[百度百科]**

Maven主要服务于基于Java平台的项目构建依赖管理项目信息管理

1.1. 项目构建

打包发布:

  1. 普通的工具类;打成jar包;
  2. web工程;打成war包;

1.2. 依赖管理 Maven(专家)

解决导jar包难题;

  1. 找jar包?去哪儿找?
  2. 导jar包?spring-core----commons-logging;很多jar包要运行又依赖其他包;
  3. 统一管理jar包?

1.3. 项目信息管理

Maven能够提供高质量的项目信息,包括依赖关系、测试报告、站点信息等详细内容,并自动生成静态页面,拷贝到服务器上就可以直接使用。

2. Maven的安装及IDEA的配置

2.1. Maven的安装及配置

  1. maven依赖java环境;检查Java环境;

  2. 将maven解压到非中文无空格目录下;

  3. 将maven加入到环境变量中

    ​ 先添加一个MAVEN_HOME指定maven的安装根目录
    在这里插入图片描述
    ​ 以后经常会运行一些maven命令;将maven的bin目录放在Path下
    在这里插入图片描述
    ​ 测试:使用 mvn -v:查看maven版本
    在这里插入图片描述

2.2. IDEA中配置Maven

在这里插入图片描述

  1. 配置本地仓库路径
    在这里插入图片描述
  2. 添加国内的阿里云镜像
    在这里插入图片描述
  3. 在idea中配置Maven
    在这里插入图片描述
    在这里插入图片描述
  4. 在IDEA中创建项目

3. Maven依赖

Maven 项目,如果需要使用第三方的控件,都是通过依赖管理来完成的。这里用到的一个东西就是 pom.xml 文件,概念叫做项目对象模型(POM,Project Object Model),我们在 pom.xml 中定义了 Maven 项目的形式,所以,pom.xml 相当于是 Maven 项目的一个地图。就类似于 web.xml 文件用来描述三大 web 组件一样。

这个地图中都涉及到哪些东西呢?

3.1. Maven坐标

<!--在 dependencies 标签中,添加项目需要的 jar 所对应的 maven 坐标。-->
<dependencies>
    <!--一个 dependency 标签表示一个坐标-->
	<dependency>
        <!--团体、公司、组织机构等等的唯一标识。-->
        <groupId>junit</groupId>
        <!--artifactId 相当于在一个组织中项目的唯一标识符。-->
        <artifactId>junit</artifactId>
        <!--一个项目的版本。-->
        <version>4.11</version>
        <!--表示依赖范围。-->
        <scope>test</scope>
    </dependency>
</dependencies>

3.2. 依赖范围

img

我们添加了很多依赖,但是不同依赖的使用范围是不一样的。最典型的有两个,一个是数据库驱动,另一个是单元测试

  • 数据库驱动,在使用的过程中,我们自己写代码,写的是 JDBC 代码,只有在项目运行时,才需要执行 MySQL 驱动中的代码。所以,MySQL 驱动这个依赖在添加到项目中之后,可以设置它的 scope 为 runtime,编译的时候不生效。
  • 单元测试,只在测试的时候生效,所以可以设置它的 scope 为 test,这样,当项目打包发布时,单元测试的依赖就不会跟着发布。

3.3. 依赖冲突

3.3.1. 冲突产生的原因

img

在图中,a.jar 依赖 b.jar,同时 a.jar 依赖 d.jar,这个时候,a 和 b、d 的关系是直接依赖的关系,a 和 c 的关系是间接依赖的关系。

3.3.2. 解决冲突

  1. 路径近者优先原则
  2. 路径相同,先声明优先原则

以 spring-context 为例,下图中 x 表示失效的依赖(优先级低的依赖,即路径近的依赖优先使用):

img

上面这两条是默认行为。

我们也可以手动控制。手动控制主要是通过排除依赖来实现,如下:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.9.RELEASE</version>
    <exclusions>
        <!--这个表示从 spring-context 中排除 spring-core 依赖。-->
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4. 聚合工程

所谓的聚合工程,实际上也就是多模块项目。在一个比较大的互联网项目中,项目需要拆分成多个模块进行开发,比如订单模块、VIP 模块、支付模块、内容管理模块、CMS、CRM 等等。这种拆分方式,实际上更接近于微服务的思想。在一个模块中,还可以继续进行拆分,例如分成 dao、service、controller 等。

有人可能会说,这个分包不就行了吗?

小项目当然可以分包,大项目就没法分包了。比如,在一个大的电商系统中,有一个子模块叫做用户管理、还有一个子模块叫做订单管理,这两个子模块都涉及到用户,像这种情况,我们就需要将用户类单独提取出来,做成单独的模块,供其他模块调用。

4.1. 多模块项目展示

|--javaboy-parent
      |-- javaboy-cms
      |-- javaboy-crm
      |-- javaboy-manger
           |-- javaboy-manager-model
           |-- javaboy-manager-dao
           |-- javaboy-manager-service
           |-- javaboy-manager-web

以 javaboy-manger 为例,javaboy-manager 本身并不提供功能,它只负责管理他自己的子模块,而他的子模块每一个都无法独立运行,需要四个结合在一起,才可以运行。项目打包时,model、dao、service 都将打包成 jar,然后会自动将打包好的 jar 复制到 web 中,再自动将 web 打包成 war 包。

4.2. IDEA 中创建聚合工程

  1. 创建一个空的 Maven 项目:
img

项目创建完成后,由于 parent 并不参与业务的实现,只是用来管理它的子模块,因此,src 目录可以将其删除。

img

  1. 选中当前工程,右键单击,New->Module
img 然后继续选择创建一个 Maven 项目: img

在 IDEA 中,已经默认指明了当前 Module 的 parent,开发者只需要填入当前 Module 的 artifactId 即可:

img

javaboy-manager 创建完成后,此时,观察 javaboy-parent 的 pom.xml 文件,发现它自动加上了 packing 属性:

img

其中,它的 packaging 属性值为 pom,这表示它是一个聚合工程,同时,他还多了 modules 节点,指明了它自己的子模块。
同时,注意 javaboy-manager ,它自身多了一个 parent 节点,这个 parent 节点描述了它的父模块的属性值:

<parent>
    <artifactId>javaboy-parent</artifactId>
    <groupId>org.javaboy</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

这个 parent 不仅仅是一个简单的父子关系描述,它存在继承关系,一般我们可以在 parent 中统一定义依赖或者插件的版本号

  1. 由于 javaboy-manager 本身也是一个聚合工程,因此,javaboy-manager 的 src 目录也可以删除。

img

  1. 选中 javaboy-manager,右键单击,New->Module 创建一个新的 Maven 模块出来。这个步骤类似于第二步,不在赘述。
    这里,新的 javaboy-manager-model 创建成功后,我们手动配置它的 packaging 属性值为 jar。

img

  1. 依照第 4 步,再分别创建 javaboy-manager-service 以及 javaboy-manager-dao

  2. 继续创建 javaboy-manager-web 模块,不同于其他模块,web 模块需要打包成 war。

  3. web 工程创建完成后,完善模块之间的继承关系。

    javaboy-manager-web 依赖 javaboy-manager-service
    javaboy-manager-service 依赖 javaboy-manager-dao
    javaboy-manager-dao 依赖 javaboy-manager-model

    注意,依赖默认是有传递性的,即在 javaboy-manager-dao 中依赖了 javaboy-manager-model,在 javaboy-manager-service 也能访问到。

    配置后的依赖关系如下图:

img

接下来就可以在不同的模块中写代码,然后进行项目部署了。

有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:

  1. 不可以直接单独打包
  2. 如果要打包,有两种方式:
  • 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
    YjlNdGdrSEJiQXFKblFNYWZ5aWFNRE1qVDNaNlZvOEZBNDdpYXlDbWcvNjQw?x-oss-process=image/format,png)

接下来就可以在不同的模块中写代码,然后进行项目部署了。

有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:

  1. 不可以直接单独打包
  2. 如果要打包,有两种方式:
  • 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
  • 从聚合工程处打包,即从 web 的parent 处打包。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值