Maven专题(四)-maven分模块构建工程

基于上一章的工程分析
继承:创建一个 parent 工程将所需的依赖都配置在 pom 中
聚合:聚合多个模块运行。

1. 需求

需求描述
将 SSM 工程拆分为多个模块开发:

ssm_dao
ssm_service
ssm_web

在这里插入图片描述
理解继承和聚合
通常继承和聚合同时使用。
何为继承?

继承是为了消除重复,如果将 dao、 service、 web 分开创建独立的工程则每个工程的 pom.xml
文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的
配置提取出来在父工程的 pom.xml 中定义。

何为聚合?

项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在
一起运行,比如: dao、 service、 web 三个工程最终会打一个独立的 war 运行。

2. 案例实现

2.1 maven-parent 父模块

2.1.1 创建父工程

1、选择骨架创建父工程
在这里插入图片描述2、填写坐标在这里插入图片描述3、确认使用的是本地仓库
在这里插入图片描述5、注意代码所在的路径(默认)
在这里插入图片描述6、设置项目的打包方式

<?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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.bruceliu.ssm</groupId>
  <artifactId>maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

</project>

2.1.2 定义 pom.xml

在父工程的 pom.xml 中抽取一些重复的配置的,比如:锁定 jar 包的版本、设置编译版本等。

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bruceliu.ssm</groupId>
    <artifactId>maven-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <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>

</project>

2.1.3 将父工程发布至仓库

父工程创建完成执行 install 将父工程发布到仓库方便子工程继承:
在这里插入图片描述

2.2 ssm_dao 子模块

2.2.1 创建 dao 子模块

1、 在父工程上右击创建 maven 模块:
在这里插入图片描述2、 选择“跳过骨架选择”:
在这里插入图片描述3、填写模块名称
在这里插入图片描述4、下一步,确定项目的目录
在这里插入图片描述5、打包方式是 jar

<?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>maven-parent</artifactId>
        <groupId>com.bruceliu.ssm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm_dao</artifactId>
    <packaging>jar</packaging>

</project>

2.2.2 定义 pom.xml

只添加到层的 pom, mybatis 和 spring 的整合相关依赖

<?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>maven-parent</artifactId>
        <groupId>com.bruceliu.ssm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm_dao</artifactId>
    <packaging>jar</packaging>

    <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>

</project>

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:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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/ssm" />
        <!-- 用户名 -->
        <property name="username" value="root" />
        <!-- 密码 -->
        <property name="password" value="123456" />
    </bean>

    <!-- mapper 配置 -->
    <!-- 让 spring 管理 sqlsessionfactory 使用 mybatis 和 spring 整合包中的 -->
    <bean id="sqlSessionFactory"
          class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.bruceliu.pojo"/>
    </bean>

    <!-- mapper 扫描器 :用来产生代理对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.bruceliu.dao"></property>
    </bean>

</beans>

2.2.5 单元测试

1、 首先在 dao 模块的 pom.xml添加 junit 的依赖,添加时 Scope 选择 test

 <!--单元测试-->
 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
 </dependency>

2、编写 junit 测试代码

/**
 * @Auther: bruceliu
 * @Date: 2020/1/14 16:29
 * @QQ:1241488705
 * @Description:
 */
public class TestSSM {

    @Test
    public void testFindItemsById() {
        //获取 spring 容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-dao.xml");
        //获取 Mapper
        EmployeeMapper employeeMapper = applicationContext.getBean(EmployeeMapper.class);
        //调用 Mapper 方法
        Employee employee = employeeMapper.findById(2L);
        System.out.println(employee);
    }
}

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 相关的依赖:

<?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>maven-parent</artifactId>
        <groupId>com.bruceliu.ssm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>

    <artifactId>ssm_service</artifactId>

    <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>com.bruceliu.ssm</groupId>
            <artifactId>ssm_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>

</project>

2.3.3 service 接口

将 ssm_maven 工程中的 service 接口拷贝到 src/main/java 中:
在这里插入图片描述

2.3.4 配置文件

创建 applicationContext-service.xml, 此文件中定义的 service。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.bruceliu.service"/>

</beans>

2.3.5 依赖范围对传递依赖的影响(了解)

2.3.5.1 问题描述

当在写 junit 测试时发现,代码报出没有找不到类的错误信息

在这里插入图片描述
是因为没有 junit.jar 引起的!为什么会这样呢?我们 ssm_dao 模块中有 junit 依赖而
ssm_service 模块依赖了 ssm_dao,难道 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.6 单元测试

遇到依赖没有传递过来的问题我们通常的解决方案是在本工程中直接添加依赖:
把如下依赖添加到 ssm_service 的工程中:

<?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>maven-parent</artifactId>
        <groupId>com.bruceliu.ssm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>

    <artifactId>ssm_service</artifactId>

    <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>com.bruceliu.ssm</groupId>
            <artifactId>ssm_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

再看测试代码也不报错了

/**
 * @Auther: bruceliu
 * @Date: 2020/1/14 16:29
 * @QQ:1241488705
 * @Description:
 */
public class TestSSM {

    @Test
    public void testFindItemsById() {
        //获取 spring 容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-dao.xml");
        //获取 Mapper
        EmployeeService employeeService = applicationContext.getBean(EmployeeService.class);
        //调用 Mapper 方法
        Employee employee = employeeService.findById(2L);
        System.out.println(employee);
    }
}

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 的依赖

  <dependencies>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- 依赖 service -->
        <dependency>
            <groupId>com.bruceliu.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>

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 插件,运行的端口和路径以子工程为准。

发布了274 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/BruceLiu_code/article/details/103970998