maven分模块构建ssm项目知识准备
一、maven基础知识回顾
maven是一个项目管理工具;提供 依赖管理 与 一键构建
1). 依赖管理
maven对项目中jar包的管理过程。传统工程我们直接把jar包放置在项目中。maven工程真正的jar包放置在仓库中,项目中只用放置jar包的坐标。
1. 仓库的种类
- 本地仓库
- 远程仓库【私服】
- 中央仓库
2. 坐标的书写规范
- groupId 公司或组织域名的倒序
- artifactId 项目名或模块名
- version 版本号
3. 依赖范围
- Compile 默认:编译 测试 运行
- Provided 编译 测试
- Runtime 测试 运行
- Test 测试
2. 仓库之间的关系
当我们启动一个maven工程的时候,maven工程会通过pom文件中jar包的坐标去本地仓库找对应jar包。默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。在公司中,如果本地没有对应jar包,会先从私服下载jar包,如果私服没有jar包,可以从中央仓库下载,也可以从本地上传。
2). 一件构建
maven自身集成了tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作。
注意:3.3+版本需要 jdkj.7+以上的支持
3). maven常用命令
- clean
- compile
- test
- package
- install
- deploy
4). maven三套生命周期
- 清理生命周期
- 默认生命周期
- 站点生命周期【几乎不用,了解即可】
二、坐标传递依赖规则
如下图【了解即可】,一个ssm整合中的父parent工程和子工程dao等,默认就是直接依赖,级别是compile;例如,如果父工程中导入了junit,scope是test,对照下图即可知道
解决方案:一般遇到这种问题,直接在对象模块导入对应依赖的坐标即可!
三、maven工程依赖冲突覆盖以及解决方案
jar包冲突一般指的是jar包依赖的版本冲突!
在idea中,点击右边贴边栏的
MavenProjects
, 选择对应的项目,点击一个图标(如下为idea2018年2,其他版本可能不同),可以看到项目jar包依赖关系,可以根据此关系以及提示信息判断是否有jar包冲突!
1). 方式①:【强烈推荐】 直接排除法
当我们要排除某个jar包下的依赖包,可以配置exclusions标签,内部可以不写版本号。代表的就是本jar包所依赖的依赖包版本;
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
3). 方式②:第一声明优先原则
在pom.xml中哪个jar包坐标配置靠前,哪个jar包就是先声明的先声明的jar包坐标下的依赖包,可以优先进入项目。
2). 方式③:路径近者优先原则
直接依赖路径不传递依赖路径近,最终进入项目的jar包将会是路径近的直接依赖包。
相关概念
- 直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包
- 简介依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去。
4). 直接使用ssm工程需要的jar包坐标
正常情况下,配置一个ssm工程需要解决的jar包冲突需要3+小时以上,可以先配置好然后直接copy使用;
四、坐标版本锁定
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中。
在pom.xml中配置
1). 锁定jar包版本
maven工程是可以分为父子依赖关系的。凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。比如:当前有A项目,项目B依赖A。那么A项目中所有的jar包都会传递到B项目中。B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖。那么直接依赖的jar包会把A项目传递给B的jar包覆盖掉。为了防止以上情况的出现,可把A项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中,即便是又同名jar包直接依赖,也无法覆盖!
- 格式
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
...
</dependencies>
</dependencyManagement>
- 注意:锁定jar包版本的配置和配置依赖坐标的格式一样,但是锁定jar包只是将版本锁定,不能替代配置坐标依赖;在配置锁定时将需要被锁定jar包的坐标copy进锁定配置即可;
2). 统一版本的配置方式
使用pom.xml中的el表达式;方便版本更换!
- 配置统一版本
<!-- 统一管理jar包版本 -->
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
...
</properties>
- 使用方式
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
...
五、maven的拆分与聚合思想
1). 工程和模块的区别
- 工程和模块都不等同于完整的项目,一个完整的项目看的是代码,代码完整,就可以判定这是一个完整的项目,与此项目是工程或者模块没有关系。
- 工程默认只能使用自己内部的资源,默认是独立的。工程可以和其他工程或者模块建立关系。模块默认不是独立的,默认属于父工程,模块一旦创建,所有父工程的资源都可以使用。
- 父子工程之间,子模块默认继承父工程,可以使用父工程所有资源。子模块之间是没有任何关系的。
- 父子工程之间不用建立关系,继承关系是默认的,不需要手动建立。
- 平级之间的引用叫依赖,依赖【scope】不是默认的需要建立;导入模块的坐标即可!导入了坐标之后,被导入模块的所有文件,包括配置文件,在导入的模块中都能使用,比如同一个父工程下的service和dao模块,如果service中导入了dao在坐标,那么service模块中就可以使用dao中的所有class文件以及相关的配置文件!
2). 继承与聚合
继承
继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml文件中的内容存在重复,比如:设置编译版本、锁定 spring的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。
聚合
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web 三个工程最终会打一个独立的war 运行。
六、使用maven分模块构建ssm项目
代码详见maven分模块构建ssm项目
七、maven父子工程三种启动方式
1). 父工程启动maven中的插件
点击idea右侧贴边栏,选择父工程的插件,选择tomcat7,在点击tomcat7:run,即可
2). web模块启动maven中的插件
使用父工程,选择生命周期,双击install添加到本地仓库,然后执行web模块的tomcat7:run即可
3). idea中配置的本地tomcat
在idea中配置本地tomcat服务器即可!