目录
1 需求
2 案例实现
2.1 maven-parent 父模块
2.1.1 创建父工程
2.1.2 定义 pom.xml
2.1.3 将父工程发布至仓库
2.2 ssm_dao 子模块
2.2.1 创建 dao 子模块
2.2.2 定义 pom.xml
2.2.3 dao 代码
2.2.4 配置文件
2.2.5 单元测试
2.2.6 把 dao 模块 install 到本地仓库
2.3 ssm_service 子模块
2.3.1 创建 service 子模块
2.3.2 定义 pom.xml
2.3.3 service 接口
2.3.4 配置文件
2.3.5 依赖范围对传递依赖的影响(了解)
2.3.6 单元测试
2.3.7 Install 到本地仓库
2.4 ssm_web 子模块
2.4.1 创建 web 子模块
2.4.2 定义 pom.xml
2.4.3 controller
2.4.4 配置文件
2.5 运行调试
3 分模块构建工程-依赖整合
-
1 需求
- 基于上边的三个工程分析
- 聚合:聚合多个模块运行。
- 继承:创建一个 parent 工程将所需的依赖都配置在 pom 中
- 需求描述
- 将 SSM 工程拆分为多个模块开发:
- ssm_dao
- ssm_service
- ssm_web
- 将 SSM 工程拆分为多个模块开发:
- 理解继承和聚合
- 通常继承和聚合同时使用。
- 何为继承?
- 继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml。
- 文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。
- 何为聚合?
- 项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web 三个工程最终会打一个独立的 war 运行。
-
2 案例实现
-
2.1 maven-parent 父模块
-
2.1.1 创建父工程
- 1、选择骨架创建父工程
- 2、填写坐标
- 3、确认使用的是本地仓库
- 4、注意代码所在的路径(默认)
- 5、设置项目的打包方式
-
2.1.2 定义 pom.xml
- 在父工程的 pom.xml 中抽取一些重复的配置的,比如:锁定 jar 包的版本、设置编译版本等。
-
<properties> <spring.version>5.0.2.RELEASE</spring.version> <springmvc.version>5.0.4.RELEASE</springmvc.version> <mybatis.version>3.4.5</mybatis.version> </properties> <dependencyManagement> <dependencies> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- springMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springmvc.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <target>1.8</target> <source>1.8</source> </configuration> </plugin> </plugins> </build>
-
2.1.3 将父工程发布至仓库
- 父工程创建完成执行 install 将父工程发布到仓库方便子工程继承:
-
-
2.2 ssm_dao 子模块
-
2.2.1 创建 dao 子模块
-
1、在父工程上右击创建 maven 模块:
- 2、选择“跳过骨架选择”:
- 3、填写模块名称
- 4、下一步,确定项目的目录
- 5、打包方式是 jar
-
-
2.2.2 定义 pom.xml
- 只添加dao层的 pom,mybatis 和 spring 的整合相关依赖
-
<dependencies> <!-- Mybatis 和 mybatis 与 spring 的整合 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- MySql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <!-- druid 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency> <!-- spring 相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> </dependencies>
-
2.2.3 dao 代码
- 把文件夹转成 sources root
- 将 ssm_maven 工程中的 dao 接口、映射文件及 pojo 类拷贝到 src/main/java 中:
-
2.2.4 配置文件
- 将 applicationContext.xml 拆分出一个 applicationContext-dao.xml,此文件中只配置 dao 相关
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <!-- url --> <property name="url" value="jdbc:mysql://localhost:3306/maven" /> <!-- 用户名 --> <property name="username" value="root" /> <!-- 密码 --> <property name="password" value="root" /> </bean> <!-- mapper 配置 --> <!-- 让 spring 管理 sqlsessionfactory 使用 mybatis 和 spring 整合包中的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据库连接池 --> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="cn.itcast.ssm.pojo"> </property> </bean> <!-- mapper 扫描器 :用来产生代理对象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.itcast.ssm.dao"></property> </bean> </beans>
-
2.2.5 单元测试
- 1、首先在 dao 模块的 pom.xml添加 junit 的依赖,添加时 Scope 选择 test
- 2、编写 junit 测试代码
-
public class ItemsMapperTest { @Test public void testFindItemsById() { //获取 spring 容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-dao.xml"); //获取 Mapper ItemsMapper itemsMapper = applicationContext.getBean(ItemsMapper.class); //调用 Mapper 方法 Items items = itemsMapper.findById(1); System.out.println(items); } }
-
2.2.6 把 dao 模块 install 到本地仓库
- 调过测试,install 到本地仓库
-
-
2.3 ssm_service 子模块
-
2.3.1 创建 service 子模块
- 方法同 ssm_dao 模块创建方法,模块名称为 ssm_service。
-
2.3.2 定义 pom.xml
- ssm_service 模块的 pom.xml 文件中需要继承父模块,ssm_service 依赖 ssm_dao 模块,添加spring 相关的依赖:
-
<dependencies> <!-- spring 相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <!-- dao 层的依赖 --> <dependency> <groupId>cn.itcast.ssm</groupId> <artifactId>ssm_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
-
2.3.3 service 接口
- 将 ssm_maven 工程中的 service 接口拷贝到 src/main/java 中:
-
2.3.4 配置文件
- 创建 applicationContext-service.xml,此文件中定义的 service。
-
<context:component-scan base-package="cn.itcast.ssm"/>
-
2.3.5 依赖范围对传递依赖的影响(了解)
- 2.3.5.1 问题描述
- 是因为没有 junit.jar 引起的!为什么会这样呢?我们 ssm_dao 模块中有 junit 依赖而ssm_service 模块依赖了 ssm_dao,难道 junit 不应该传递过来吗?
- 当在写 junit 测试时发现,代码报出没有找不到类的错误信息:
- 2.3.5.3 依赖范围对传递依赖的影响
- 是因为依赖会有依赖范围,依赖范围对传递依赖也有影响,例如有 A、B、C,
- A 依赖 B、
- B 依赖 C,
- C 可能是 A 的传递依赖,如下图:
- 最左边一列为直接依赖,理解为 A 依赖 B 的范围,最顶层一行为传递依赖,理解为 B依赖 C 的范围,行与列的交叉即为 A 传递依赖 C 的范围。
- 举例 1:
- 比如 A 对 B 有 compile 依赖,B 对 C 有 runtime 依赖,那么根据表格所示 A 对 C 有runtime 依赖。
- ssm_dao 依赖 junit,scop 为 test
- ssm_service 依赖 ssm_dao.
- 查看下图红色框内所示传递依赖范围:
- 所以 ssm_dao 工程所依赖的 junit 的 jar 没有加入到 ssm_service 工程。
- 举例 2:如果修改 ssm_dao 工程依赖 junit 的 scop 为 compile,ssm_dao 工程所依赖的 junit的 jar 包会加入到 ssm_service 工程中,符合上边表格所示,查看下图红色框内所示:
- 2.3.5.1 问题描述
-
2.3.6 单元测试
- 遇到依赖没有传递过来的问题我们通常的解决方案是在本工程中直接添加依赖:
- 把如下依赖添加到 ssm_service 的工程中:
- 再看测试代码也不报错了
-
2.3.7 Install 到本地仓库
-
-
2.4 ssm_web 子模块
-
2.4.1 创建 web 子模块
- 1、选择骨架创建 web 子模块
- 2、确认使用自己的本地仓库
- 3、填写模块名称
-
- 使用骨架创建 web 项目会花费些时间,请耐心等待
- 4、创建 java 和 resources 文件夹,转成 source root
- 5、添加打包方式 war
-
2.4.2 定义 pom.xml
- ssm_web 模块的 pom.xml 文件中需要继承父模块,ssm_web 依赖 ssm_service 模块和springmvc 的依赖
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>ssm_parent</artifactId> <groupId>cn.itcast.ssm</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ssm_web</artifactId> <packaging>war</packaging> <dependencies> <!-- 依赖 service --> <dependency> <groupId>cn.itcast.ssm</groupId> <artifactId>ssm_service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- springMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springmvc.version}</version> </dependency> </dependencies> </project>
-
2.4.3 controller
- 将 ssm_web 工程中的 controller 代码拷贝到 src/main/java 中:
-
-
2.4.4 配置文件
- 拷贝 ssm_web 工程中如下配置文件:
-
-
-
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 插件,运行的端口和路径以子工程为准。
- 方法 1:
-
-
3 分模块构建工程-依赖整合
- 每个模块都需要 spring 或者 junit 的 jar,况且最终 package 打完包最后生成的项目中的jar 就是各个模块依赖的整合,所以我们可以把项目中所需的依赖都可以放到父工程中,模块中只留模块和模块之间的依赖,那父工程的 pom.xml 可以如下配置:
-
<properties> <spring.version>5.0.2.RELEASE</spring.version> <springmvc.version>5.0.2.RELEASE</springmvc.version> <mybatis.version>3.4.5</mybatis.version> </properties> <dependencyManagement> <dependencies> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- springMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springmvc.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Mybatis 和 mybatis 与 spring 的整合 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- MySql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <!-- druid 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency> <!-- springMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springmvc.version}</version> </dependency> <!-- spring 相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <!-- spring 相关 事务相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <!-- junit 测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <target>1.8</target> <source>1.8</source> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>