1. maven 构建 SSM 工程
1.1 需求
实现 SSM 工程构建,规范依赖管理。场景:根据 id 展示商品信息
1.2 准备数据库
1 | SET FOREIGN_KEY_CHECKS=0; |
1.3 创建一个 maven 工程
1.3.1 新建 ssm_maven 项目,使用下图选中的骨架
1.3.2 填写坐标
1.3.3 查看是否使用的自己的私服
1.3.4 在 main 目录下新建 java 和 resources 文件夹
把 java 和 resources 文件夹转成 Sources Root和Resources Root
1.3.5 修改编译版本,在 pom.xml 文件中添加
1 | <build> |
1.4 知识点准备
1.4.1 什么是依赖传递
先添加 springmvc 的核心依赖的坐标
1 | <!-- 项目依赖jar包 --> |
会发现出现除了 spring-webmvc 以外的其他 jar。因为我们的项目依赖 spring-webmv.jar,而 spring-webmv.jar 会依赖 spring-beans.jar 等等,所以 spring-beans.jar 这些 jar 包也出现在了我 们的 maven 工程中,这种现象我们称为依赖传递。从下图中可看到他们的关系:(请注意 spring-beans 的版本)
1.4.2 依赖冲突的解决
接着添加一个依赖
1 | <!-- 项目依赖jar包 --> |
我们会发现这两个 jar 包同时都依赖了 spring-beans
spring-webmvc 依赖 spirng-beans-4.2.4,spring-context 依赖 spring-beans-5.0.2,但是发现 spirng-beans-4.2.4 加入到工程中。而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。
1.4.2.1 依赖调解原则
maven 自动按照下边的原则调解:
第一声明者优先原则:
在 pom 文件定义依赖,先声明的依赖为准。 测试:
如果将上边 spring-webmvc 和 spring-context 顺序颠倒,系统将导入 spring-beans-5.0.2。 分析:由于 spring-webmvc 在前边以 spring-webmvc 依赖的 spring-beans-5.0.2 为准,所以最终spring-beans-5.0.2 添加到了工程中。
路径近者优先原则:
例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那 如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传 递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。在本工程中的 pom 中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入spirng-beans-5.0.2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<!-- 项目依赖jar包 -->
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
1.4.2.2 排除依赖
上边的问题也可以通过排除依赖方法辅助依赖调解,如下:
比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans, 下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。
1 | <!-- 项目依赖jar包 --> |
1.4.2.3 锁定版本
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版 本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。
如下的配置是锁定了 spring-beans 和 spring-context 的版本:
1 | <!-- 锁定jar包版本 --> |
还可以把版本号提取出来,使用<properties>
标签设置成变量。
1 | <!-- 统一管理jar包版本 --> |
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加<dependencies></dependencies>
标签,如下:
1 | <!-- 项目依赖jar包 --> |
上边添加的依赖并没有指定版本,原因是已在<dependencyManagement>
中锁定了版本, 所以在<dependency>
下不需要再指定版本。
1.5 定义 pom.xml
maven 工程首先要识别依赖,web 工程实现 SSM 整合,需要依赖 spring-webmvc5.0.2、 spring5.0.2、mybatis3.4.5 等,在 pom.xml 添加工程如下依赖:
(在实际企业开发中会有架构师专门来编写 pom.xml) 分两步:
- 锁定依赖版本
- 添加依赖
1 | <!-- 统一管理jar包版本 --> |
1.6 Dao 层
在 src/main/java 中定义 dao 接口,实现根据 id 查询商品信息:
1.6.1 pojo 模型类
在 src/main/java 创建模型类
1 | /** |
1.6.2 dao 层代码
1 | /** |
1.6.3 配置文件
1 |
|
注意配置文件位置(resources下创建目录/com/wgy/dao):
在 src/main/resources 配置 log4j.properties
1 | ### direct log messages to stdout ### |
在 src/main/resources 创建 applicationContext.xml
1 |
|
1.6.4 单元测试
在 src/test/java 创建单元测试类
1 | /** |
1.7 Service 层
1.7.1 代码
1 | /** |
1 | /** |
1.7.2 配置文件
在 applicationContext.xml 中配置 service
1 | <!--service层配置文件开始--> |
1.7.3 单元测试
1 | /** |
1.8 Web 层
1.8.1 代码
1 | /** |
1.8.2 配置文件
在 src/main/resources 创建 springmvc.xml
1 |
|
配置web.xml,加载 spring 容器,配置 springmvc 前端控制器
1 |
|
1.9 Jsp
/WEB-INF/pages/itemDetail.jsp
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
1.10 运行与调试
添加 tomcat7 插件,双击右侧 tomcat7 运行
运行结果如下:
2. 分模块构建工程
基于上边的三个工程分析
继承:创建一个 parent 工程将所需的依赖都配置在 pom 中 聚合:聚合多个模块运行。
2.1 需求
2.1.1 需求描述
将 SSM 工程拆分为多个模块开发: ssm_dao、ssm_service、ssm_web
2.1.2 理解继承和聚合
通常继承和聚合同时使用
何为继承?
继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml 文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。
何为聚合?
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比如:dao、service、web 三个工程最终会打一个独立的 war 运行。
2.2 案例实现
2.2.1 maven-parent 父模块
2.2.1.1 创建父工程
工程只有pom.xml文件
1 |
|
2.2.1.2 定义 pom.xml
在父工程的 pom.xml 中抽取一些重复的配置的, 比如: 锁定 jar 包的版本、 设置编译版本等。
具体配置同上1.5
2.2.2 ssm_dao 子模块
2.2.2.1 创建 dao 子模块
在父工程上右击创建 maven 模块
1 |
|
2.2.2.2 dao 代码
将 ssm_maven 工程中的 dao接口、映射文件及 pojo 类拷贝到 src/main/java 中:
2.2.2.3 配置文件
将 applicationContext.xml拆分出一个applicationContext-dao.xml,此文件中只配置 dao 相关内容
1 |
|
2.2.3 ssm_service 子模块
2.2.3.1 创建 service 子模块
方法同 ssm_dao 模块创建方法。ssm_service 依赖 ssm_dao 模块
1 |
|
2.2.3.2 service 代码
将 ssm_maven 工程中的service接口、实现类拷贝到 src/main/java中:
2.2.3.3 配置文件
将 applicationContext.xml拆分出一个applicationContext-service.xml,此文件中只配置 service相关内容
1 |
|
2.2.4 ssm_web 子模块
2.2.4.1 创建 web 子模块
ssm_web 依赖 ssm_service 模块
1 |
|
2.2.4.2 controller 代码
将 ssm_web 工程中的controller 代码拷贝到src/main/java 中:
2.2.4.3 配置文件
拷贝 ssm_web 工程中配置文件
将 applicationContext.xml引入server、dao配置:
1 |
|
2.2.5 运行调试
方法 1:在 ssm_web 工程的 pom.xml 中配置 tomcat 插件运行
运行 ssm_web 工程它会从本地仓库下载依赖的 jar 包,所以当 ssm_web 依赖的 jar 包内容修改了必须及时发布到本地仓库,比如:ssm_web 依赖的 ssm_service 修改了,需要及时将ssm_service 发布到本地仓库。
方法 2:在父工程的 pom.xml 中配置 tomcat 插件运行,自动聚合并执行
推荐方法 2,如果子工程都在本地,采用方法 2 则不需要子工程修改就立即发布到本地仓库, 父工程会自动聚合并使用最新代码执行。
注意:如果子工程和父工程中都配置了 tomcat 插件,运行的端口和路径以子工程为准。
-------------本文结束感谢您的阅读-------------
本文标题: Maven(二)
本文链接: https://wgy1993.gitee.io/archives/f77862b9.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
