zoukankan      html  css  js  c++  java
  • Java第四十五天,Maven高级篇(二),工程拆分与聚合

    一、传统项目的漏洞分析

    1.问题引出

    假如有一个商城;买家用的A系统,卖家用的B系统;但是买家和卖家有很多业务是重合的,比如都需要查询每个订单消息;那么同样的代码需要写两份吗?如果更多子系统呢?

    2.问题分析

    我们分析一下 Maven 出现的一个重要原因,就是为了共用代码,共用jar包;那么同样的现象出现在了两套体系中:

    jar 包 <===> jar 包中央仓库

    拓展系统(子系统) <===> 公共系统(父系统)

    3.茅塞顿开

    那么,我们可以把 公共系统 当成 jar包中央仓库,把拓展系统当成 jar 包吗?当然可以,都是代码而已,都有唯一标识!

    二、Maven 的解决办法

    1.拆分

    Maven 把一个完整的项目,分成不同的独立模块,这些模块都有各自独立的坐标,哪个地方需要其中某个模块,就直接引用该模块的坐标即可

    2.聚合

    Maven 在 “模块仓库” 中找到需要的模块,再将它们聚合为一个新的完整的项目

    3.注意事项

    (1)子模块必须使用 <parent/> 标签标记其父工程;<parent/> 标签内父工程的三个坐标需完整

    (2)子模块可以共用父工程的 <groupId/> 和 <version/> 标签,但是必须提供自己的 <artifactId>

    例如:

    <?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>
            <groupId>父工程项目组织名</groupId>
            <artifactId>父工程项目名</artifactId>
            <version>版本</version>
        </parent>
        <artifactId>子模块项目名</artifactId>
    
    
    </project>

    (3)父工程必须使用 <modules/> 标签标记其所有子模块

    例如:

    <?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>
        <packaging>pom</packaging>
    
        <groupId>父工程项目组织名</groupId>
        <artifactId>父工程项目名</artifactId>
        <version>父工程版本</version>
    
        <modules>
            <module>子模块项目名</module>
        </modules>
    
    
    </project>

    三、Maven 拆分与聚合实战

    1.创建父工程

    父工程只需要一个 pom.xml 配置文件即可;所以创建project 或 module 均可;因此一般直接选择创建 Maven 工程即可(可以不用骨架创建)

    2.创建子模块

    (1)创建 Dao 层子模块

    因为 dao 层不需要页面交互,所以只需要一个简单的 Maven Java 工程即可,因此也不可以不用骨架创建

    (2)创建 Service 层子模块

    业务层也不需要与页面进行交互,因此也可以只创建一个简单的 Maven Java 模块

    (3)创建 Controller 层子模块

    因为我们选择用 controller 层与页面进行交互,因此这里选择用骨架创建 Maven webapp 项目

    3.修改父工程的 pom.xml 配置文件

    <?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.lanyue</groupId>
        <!--父工程项目名-->
        <artifactId>mavens</artifactId>
        <!--父工程项目打包方式-->
        <packaging>pom</packaging>
        <!--父工程项目版本-->
        <version>1.0-SNAPSHOT</version>
    
        <!--父工程的所有子模块-->
        <modules>
            <!--dao 层子模块-->
            <module>maven_dao</module>
            <!--service 层子模块-->
            <module>maven_service</module>
            <!--controller 层子模块-->
            <module>maven_controller</module>
        </modules>
    
        <properties>
            // 父工程的所有配置信息
            ......
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                ......
                </dependency>
                
                // 所有需要锁定版本的 jar依赖包
                ......
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                ......
            </dependency>
            
            // 父工程的所有 jar依赖包
            ......
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    ......
                </plugin>
    
                // 父工程的所有 依赖插件
                ......
            </plugins>
        </build>
    
    </project>
    

    4.修改 dao层 子模块的 pom.xml 配置文件

    因为 dao层子模块 不依赖其它的子模块,所以可以不添加其它子模块的依赖坐标

    <?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>mavens</artifactId>
            <groupId>com.lanyue</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <!--自己(子模块)的 项目名-->
        <artifactId>maven_dao</artifactId>
    
    
    </project>

    5.修改 service层 子模块的 pom.xml 配置文件

    因为 service层子模块 依赖与 dao层子模块,所以需要引入 dao层子模块 的依赖坐标

    <?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>mavens</artifactId>
            <groupId>com.lanyue</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <!--自己(子模块)的项目名-->
        <artifactId>maven_service</artifactId>
    
        <dependencies>
            <!--dao层 依赖的 坐标-->
            <dependency>
                <groupId>com.lanyue</groupId>
                <artifactId>maven_dao</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    
    </project>
    
    

    6.修改 controller 层 子模块 pom.xml 配置文件

    因为 controller层子模块 依赖与 service层子模块,所以需要引入 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>mavens</artifactId>
            <groupId>com.lanyue</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <!--自己(子模块)的项目名-->
        <artifactId>maven_controller</artifactId>
        <!--打包方式-->
        <packaging>war</packaging>
    
        <dependencies>
            <dependency>
                <!--service层 依赖的 坐标-->
                <groupId>com.lanyue</groupId>
                <artifactId>maven_service</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    
    </project>
    

    7.注意事项

    • 各个子模块各自需要用到的配置文件需要每个模块自己提供
    • 如果某个模块需要用到其它模块的配置文件,需要在自己的配置文件中用 <import/> 标签导入其它模块的配置文件;如 controller 层的配置文件需要用到 dao 层和 service 层的配置文件(spring mvc 三层的整合是在 controller 层进行的),配置方法如下:
    <?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"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           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
    			    http://www.springframework.org/schema/aop
    			    http://www.springframework.org/schema/aop/spring-aop.xsd
    			    http://www.springframework.org/schema/tx
    			    http://www.springframework.org/schema/tx/spring-tx.xsd
    			    http://www.springframework.org/schema/mvc
    			    http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--引入 dao 层配置文件-->
        <import resource="classpath:spring/applicationContext-dao.xml"/>
        <!--引入 service 层配置文件-->
        <import resource="classpath:spring/applicationContext-service.xml"/>
    </beans>

    四、工程和模块的区别

    • 工程和模块都不一定是完整的项目;只要代码完整,这个项目就完整,与它是工程还是模块无关
    • 工程只能使用自己内部的资源,天生是独立的,但后天可以与其它工程或模块建立关联关系
    • 模块天生是属于父工程的,天生不是独立的,模块一旦创建,所有父工程的资源都可以使用
    • 工程可以理解为自己一无所有奋斗的人,模块可以理解为富二代

    五、子模块与父工程之间的关系

    • 子模块天生继承父工程,可以使用父工程的所有资源
    • 子模块之间天生是没有任何关系的,但是它们之间可以通过相关依赖标签建立关系
    • 平级之间的引用叫依赖(子模块与子模块之间),依赖不是先天的,是需要后天建立的
    • 父子工程之间不用建立关系,继承关系是先天的,不需要手动建立

    六、依赖范围(由 scope 标签值指定)对项目各个阶段(编译、运行、测试)的支持情况

     

    scope ↓ 编译 运行 测试 举例 备注
    compile Y Y Y spring-core 默认值
    provided N   Y jdk、servlet-api  
    runtime   N Y jdbc驱动  
    test     N junit  
    system Y   Y   与compile一样不推荐
    import         忽略
    • compile ===> 默认范围,编译测试运行都有效
    • provided ===> 在编译和测试时有效 
    • runtime ===> 在测试和运行时有效 
    • test ===> 只在测试时有效
    • system ===> 在编译和测试时有效,与本机系统关联,可移植性差

    七、依赖范围对传递依赖的影响

    • —— ===> 传递丢失,即不可使用;需要在子模块 重新引入 源 jar依赖包 坐标

    表格详解

    • 假如 A 直接依赖 B,B 直接依赖 C,则 A 传递依赖(间接依赖)C;
    • 最左边一列为 A 直接依赖 B 的范围,最上边一行为 B直接依赖C 的范围(言外之意就是说 A 传递依赖 C 的范围);
    • 行与列的交叉即为 A 传递依赖 C 的范围

    八、Maven 父子工程的三种启动方式

    1.直接启动父工程

    2.将 dao层、service层 安装到本地仓库后启动 web 层子模块

    (1)将 所有层 的依赖项目 安装到本地仓库

    (2)启动 web 子模块

    3.使用本地安装的 Tomcat 启动

  • 相关阅读:
    Apache Jmeter 性能测试
    linux 达梦数据库 命令行 卸载
    vue控制台报错Duplicate keys detected: 'xxxx'. This may cause an update error.解决方案
    springboot报错说 Failed to parse multipart servlet request; nested exception is java.io.IOException
    简单理解Callable接口
    Windows下设置Mongodb用户名密码
    Win10 搭建FTP环境,并使用Java实现上传,下载,删除
    【小组展示】1
    【计网II】
    【密码学】AES
  • 原文地址:https://www.cnblogs.com/viplanyue/p/13573666.html
Copyright © 2011-2022 走看看