文章目录
1. Maven简介
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具**[百度百科]**
Maven主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
1.1. 项目构建
打包发布:
- 普通的工具类;打成jar包;
- web工程;打成war包;
1.2. 依赖管理 Maven(专家)
解决导jar包难题;
- 找jar包?去哪儿找?
- 导jar包?spring-core----commons-logging;很多jar包要运行又依赖其他包;
- 统一管理jar包?
1.3. 项目信息管理
Maven能够提供高质量的项目信息,包括依赖关系、测试报告、站点信息等详细内容,并自动生成静态页面,拷贝到服务器上就可以直接使用。
2. Maven的安装及IDEA的配置
2.1. Maven的安装及配置
-
maven依赖java环境;检查Java环境;
-
将maven解压到非中文无空格目录下;
-
将maven加入到环境变量中
先添加一个MAVEN_HOME指定maven的安装根目录
以后经常会运行一些maven命令;将maven的bin目录放在Path下
测试:使用 mvn -v:查看maven版本
2.2. IDEA中配置Maven
- 配置本地仓库路径
- 添加国内的阿里云镜像
- 在idea中配置Maven
- 在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. 依赖范围
我们添加了很多依赖,但是不同依赖的使用范围是不一样的。最典型的有两个,一个是数据库驱动,另一个是单元测试。
- 数据库驱动,在使用的过程中,我们自己写代码,写的是 JDBC 代码,只有在项目运行时,才需要执行 MySQL 驱动中的代码。所以,MySQL 驱动这个依赖在添加到项目中之后,可以设置它的 scope 为 runtime,编译的时候不生效。
- 单元测试,只在测试的时候生效,所以可以设置它的 scope 为 test,这样,当项目打包发布时,单元测试的依赖就不会跟着发布。
3.3. 依赖冲突
3.3.1. 冲突产生的原因
在图中,a.jar 依赖 b.jar,同时 a.jar 依赖 d.jar,这个时候,a 和 b、d 的关系是直接依赖的关系,a 和 c 的关系是间接依赖的关系。
3.3.2. 解决冲突
- 路径近者优先原则
- 路径相同,先声明优先原则
以 spring-context 为例,下图中 x 表示失效的依赖(优先级低的依赖,即路径近的依赖优先使用):
上面这两条是默认行为。
我们也可以手动控制。手动控制主要是通过排除依赖来实现,如下:
<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 中创建聚合工程
- 创建一个空的 Maven 项目:
![img](https://i-blog.csdnimg.cn/blog_migrate/8f05725fa88cd08ac03107dbba59cc98.png)
项目创建完成后,由于 parent 并不参与业务的实现,只是用来管理它的子模块,因此,src 目录可以将其删除。
- 选中当前工程,右键单击,New->Module
![img](https://i-blog.csdnimg.cn/blog_migrate/eedfc7dedabd63ff39d884952927e9dd.png)
![img](https://i-blog.csdnimg.cn/blog_migrate/70e0effccde9bd8e47136793fbfdf6b3.png)
在 IDEA 中,已经默认指明了当前 Module 的 parent,开发者只需要填入当前 Module 的 artifactId 即可:
![img](https://i-blog.csdnimg.cn/blog_migrate/d70a53e5c30b25c1cd4e852e81aa22dd.png)
javaboy-manager 创建完成后,此时,观察 javaboy-parent 的 pom.xml 文件,发现它自动加上了 packing 属性:
其中,它的 packaging 属性值为 pom,这表示它是一个聚合工程,同时,他还多了 modules 节点,指明了它自己的子模块。
同时,注意 javaboy-manager ,它自身多了一个 parent 节点,这个 parent 节点描述了它的父模块的属性值:
<parent>
<artifactId>javaboy-parent</artifactId>
<groupId>org.javaboy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
这个 parent 不仅仅是一个简单的父子关系描述,它存在继承关系,一般我们可以在 parent 中统一定义依赖或者插件的版本号
- 由于 javaboy-manager 本身也是一个聚合工程,因此,javaboy-manager 的 src 目录也可以删除。
- 选中 javaboy-manager,右键单击,New->Module 创建一个新的 Maven 模块出来。这个步骤类似于第二步,不在赘述。
这里,新的 javaboy-manager-model 创建成功后,我们手动配置它的 packaging 属性值为 jar。
-
依照第 4 步,再分别创建 javaboy-manager-service 以及 javaboy-manager-dao
-
继续创建 javaboy-manager-web 模块,不同于其他模块,web 模块需要打包成 war。
-
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 也能访问到。
配置后的依赖关系如下图:
接下来就可以在不同的模块中写代码,然后进行项目部署了。
有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:
- 不可以直接单独打包
- 如果要打包,有两种方式:
- 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
YjlNdGdrSEJiQXFKblFNYWZ5aWFNRE1qVDNaNlZvOEZBNDdpYXlDbWcvNjQw?x-oss-process=image/format,png)
接下来就可以在不同的模块中写代码,然后进行项目部署了。
有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:
- 不可以直接单独打包
- 如果要打包,有两种方式:
- 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
- 从聚合工程处打包,即从 web 的parent 处打包。