1. maven的概念模型
- 项目对象模型(Project Object Model)
一个maven工程独有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。- 依赖管理系统(Dependency Management System)
通过maven的依赖管理对项目所依赖的jar进行统一管理
<!--添加依赖的jar包-->
<dependencies>
<!--项目要使用到junit的jar包,所以在这里添加junit的jar包的依赖->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
2. maven工程的拆分与聚合思想
- 工程的拆分
工程的拆分可以实现分模块开发与测试,可实现多线程开发与管理,提高工程代码复用度的同时也提高软件的开发速度与效率。比如:现在要使用maven工程对一个项目进行拆分,这时候就可以将dao拆解出来,形成独立的工程,同样service,action也都进行这样的拆分把工程拆分成独立的工程,将来要用到的时候就把它们的坐标给引进来就行了.- 工程的聚合
我们的项目拆成多个子模块后,独立运行各个模块是无法完成软件项目的要求的,只有把它们都整合起来,分工合作才能完成工作。因此需要父工程来管理各个子模块,把它们聚合在一起运行,把dao,service,web打成一个独立的可运行的war包。- 继承的理解
类似java类的继承,都是为了消除重复。子类继承父类,父类里有的方法和属性在子类中就不需要再定义和实现了,使用的时候直接调用父类就可以。我们把crm拆分后,有一个父工程,子工程(dao,service,web)要用到的依赖都可以在父工程(parentProject)的pom.xml先定义好,将来子工程在开发的时候就不需要再引坐标了。- 深度理解
父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标了
3. 依赖
查看项目web左边工程显示maven dependencies,此时可以看到:把dao也依赖进来了,这是因为:依赖具有传递性
由于A -> B, B -> C
所以 A -> C
依赖传递也是有范围的
子模块dao中添加junit的依赖,scrop为test,但在service中并不能使用junit
1、纵坐标:直接依赖
A 依赖 B,B 是 A 的直接依赖。
在 A 的 pom.xml 中添加 B 的坐标。
2、横坐标:传递依赖
B 依赖 C,C 是 A 的传递依赖。
3、中间部分:传递依赖的范围,A 依赖 C 的范围。
解决方法:
如果在依赖传递过程中,导致jar包丢失,我们的做法很简单,就是再导入一次坐标
依赖传递的原则
1.第一声明者优先原则
谁先申明,就用谁的。跟坐标代码的顺序有关
添加struts2-spring-plugin(版本)在前,spring-context(版本.RELEASE)在后。引入的是struts2中的spring-beans-版本
如果将上边struts-spring-plugins和spring-context顺序颠倒,系统将导入的是spring 中的spring-beans-版本。
2.路径近者优先原则
struts2-spring-plugin(版本)跟spring-context(版本.RELEASE)都会添加spring-beans的依赖。如果这时我们直接加入新的依赖叫spring-beans.4.2.4.RELEASE,系统会直接引入spring-beans.4.2.4的版本。
4. 使用版本锁定实现解决冲突
<dependencyManagement>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencyManagement>
5. 定义版本常量
在使用坐标时,对于同一个框架,引入多次时,它的版本信息就会多次出现,所以可以借用常量的思想,将这些版本号提取出来,在需要用到的时候,直接写版本的常量名称就可以了。
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
6. Maven 中的坐标
俗称 gav:使用下面三个向量子仓库中唯一定位一个 Maven 工程
在项目中的 pom.xml 文件中,我们可以看到下面gav的定义:
1、groupid:公司或组织域名倒序
<groupid>com.zxw.maven</groupid>
2、artifactid:模块名,也是实际项目的名称
<artifactid>MavenZXW</artifactid>
3、version:当前项目的版本
<version>0.0.1-SNAPSHOT</version>
7. pom基本配置
依赖的详细配置
1、dependencies:一个 pom.xml 文件中只能存在一个这样的标签。用来管理依赖的总标签。
2、dependency:包含在dependencies标签中,可以有无数个,每一个表示一个依赖
3、groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
4、type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。
5、scope:依赖的范围,默认值是 compile。后面会进行详解。
6、optional:标记依赖是否可选。
7、exclusions:用来排除传递性依赖,后面会进行详细介绍。