Maven管理多模块应用【SpringMVC4框架技术】

一、Maven管理多模块应用的介绍

1.1 Maven 回顾

1.1.1项目构建:项目的测试、打包、部署、上线

1.1.2依赖管理:管理jar的版本

1.1.3Maven仓库

(1)本地仓库

(2)远程仓库
        ① 中央仓库
        ② 私服:公司内部用
        ③国内第三方仓库

1.2 为什么使用Maven多模块

网站演变: 网站编程、网络编程(c/s)

(1)单一应用架构

 适用于并发量低,好处方便减少部署节点和成本

(2)垂直应用架构

  并发量逐渐增大,采取把项目拆分成很多个垂直架构(多个Maven子工程)
  如果项目需求发生改变,只要改变单个模块就可以了

(3)分布式架构

 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务

(4)流动计算架构(SOA:面向服务开发)

 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现
 此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键

1.3 场景描述

commonModel:提供公共的基础服务,比如文件上传、邮件发送、权限管理等等;

businessModel:业务模块,是系统真正要实现的业务。依赖于commonModal,比如订单管理、财务统计、会员管理等;

application:可发布的web应用,由各个businessModel组成,最终满足项目整体需求;

第三方模块:包括各类框架,Spring、MyBatis、日志等。整个应用都是依赖它们完成开发的;

1.4 如何使用Maven管理以上的结构呢?

首先要弄清楚Maven的两个重要的概念,依赖和继承。举例说明:

(1)场景:

1.A、B、C三个模块是用Maven进行管理的,它们之间的关系:C依赖B、B依赖A

2.D、E、F三个模块是用Maven进行管理的。它们之间的关系:F继承自E,也就是F的parent是E。E依赖D

(2)结果:

        依赖:对于场景1,由于依赖的传递性,C模块中,除了能使用B的接口外,同时也能使用A的接口。但是在C模块中,无法继承到B模块的一些POM配置(比如<properties>定义的版本信息,<build>中定义构建信息等)

        继承:对于场景2,F是能够继承到E的Pom的配置的,比如对E对D的依赖,在F中是能够使用D中定义的接口的。还有其他的Pom配置,比如<properties>、<build>

对于上述的模块结构,如果使用Maven管理应该考虑的问题有哪些呢?

1.随着项目的进展,模块的数量不断增长。Maven对于模块的管理包含着版本的概念,只有正确的管理版本,才不至于在工作中造成版本的混乱。

是否应该有一个地方统一对版本进行管理?

2.对于所有的模块,是都需要发布到服务器上进行管理的,那么是否代表着,每一个模块都要发布到相同位置进行管理呢?如果服务器ip换了怎么办?每个模块去修改?

应该有一个地方统一管理整个项目的发布配置。

3、对于依赖的管理,通过模块结构图可以想象,模块之间的依赖是很复杂的,比如很多模块都依赖于log4j,是否每个模块都要使用<dependency>一次Log4j。

1.5 实战

基于以上的问题,将Maven的管理结构定义如下,Maven模块之间的关系和类之间的关系非常接近,因此使用类图表示。

图解:上图中绿色部分为Maven管理模块,打包类型为pom。

① root:

抽象层级最高的模块,应该配置公用级别最高的配置。也就是所有模块都需要用到的发布到服务上的配置。那么其他所有层级的模块就可以共享这一配置,比如commonModal就可以通过路径5-4-3-1继承到<distributionManagement>配置。这样问题2就得到了解决。

② version、modalVersion、businessVersion:

为版本定义模块,分别定义了第三方模块、commonModal、businessModal的版本信息。这样就解决了问题1

③ j2ee、modalGather:

分别持有对第三方模块、commonModal的依赖。application、businessModal、commonModal都可以通过继承路径,获取到上层的资源。也就不必要在所有的模块中都重复的进行引用操作

二、Maven管理多模块应用的实现

项目:primary

完成功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。

2.1 第一种实现方式

项目名称:05-maven-modules

完成功能:使用IntelliJ IDEA实现Maven管理多模块的应用开发

(1)创建Project为Empty Project

点击 Next 下一步

(2)设置项目名称和项目存放位置

为新创建的项目设置项目名称和项目位置,然后点击 Finish。

Project name:项目名称

Project location:项目存放位置

(3)文件夹不存在 提示框

提示内容如下:

项目目录D:\IT\Java\IdeaProjects\Suke2\05-CRM\05-maven-modules不存在。它将由IntellijIDEA创建。

点击 OK

(4)项目结构

选择 Cencel 取消(点击OK一样的)

Maven空项目创建成功,如下图

(5)创建Maven父工程

① 创建一个Model工程

② 选择Maven工程

③ 设置Module的GAV坐标 和 模块内容存放位置

GroupId:公司域名的倒序

ArtifactId:项目或模块名称

Version:项目或模块版本号

④ 配置导入设置

Maven项目被修改后,需要“手动更新”或“自动更新”

⑤ 设置父工程的pom文件

父工程的packaging标签的文本内容必须设置为pom。

⑥ 删除src目录

父工程要求src目录必须删除掉。

(6)创建子模块

模块名称:son1,是 parent 父工程的子模块

① 创建 Module 工程

② 创建maven son1 子工程

③ 设置Module项目基础信息

Parent:选择模块的父工程(如果选择<None>则表示与parent工程平级关系)

Name:son1

Location:设置模块存放位置:..\05-maven-modules\parent\son1

GroupId:选择父工程后,默认继承父工程的GroupId值:com.suke

ArtifactId:模块的项目名称:son1

Version:选择父工程后,默认继承父工程的Version值

④ 项目视图

⑤ 子模块项目的pom文件

parent标签:指向父工程

子工程版本号会自动继承父工程版本号

(7)父工程添加依赖

执行后效果:父工程添加依赖,子模块会无条件继承父工程所有依赖

① parent父工程依赖、插件:

<?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.suke</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>son1</module>
    </modules>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!--spring-version或者spring.version-->
        <spring-version>5.0.3.RELEASE</spring-version>
    </properties>

    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring-version}</version>
            </dependency>

            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>4.3.16.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>mvc-primary</finalName>
        <plugins>
            <!-- 编码和编译和JDK版本 -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

② son1子工程依赖、插件:

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

    <artifactId>son1</artifactId>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>mvc-primary</finalName>
        <plugins>
            <!-- 编码和编译和JDK版本 -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.2 视图重现

平级目录、层级目录、嵌套方式 

猜你喜欢

转载自blog.csdn.net/qq_45037155/article/details/124920327