分布式——Maven多模块管理

简介: Maven的多模块管理。所谓Maven的多模块管理其实:子模块继承父模块的Maven依赖,这样在多模块开发之下,多个模块的依赖版本就是一样的,这样就不会造成因模块依赖的版本不同而造成的冲突。其实Mavne管理的就是依赖的版本号。

Maven多模块管理应用


1.1 场景描述


  • commonModel:提供公共的基础服务,比如工具类、常量类等
  • bussinessModel:业务模块,是系统真正要实现的业务,依赖于common模块,比如订单管理、财务统计、会员管理等。
  • application:可发布的web应用,由各个bussinessModel组成,最终满足项目整体需求
  • 第三方模块:包含各类框架,Spring、MyBatis、日志等。整个应用都是依赖他们完成开发的。

微信截图_20220610143723.png

1.2 使用多模块管理的意义


  • Maven管理多模块应用的实现是互联网项目中多使用分布式开发,那么每个独立的服务都会使用独立的项目进行维护,那么这样就需要使用多模块的管理,来实现项目的高度统一。
  • 因为在大的项目中,可能多个地方会用到同一个依赖,但是每个模块所写的依赖版本可能不同,这样就会造成依赖冲突。此时就需要使用一个父依赖来统一的管理这些依赖。

有pom.xml文件的一定是Mavne工程,没有pom.xml文件的一定不是Maven工程

pom叫做项目对象模型:(Project Object Module)。该文件是可以被子工程继承的。


1.3 第一种方式:创建Maven父工程


1.3.1展示子功能继承父工程


  1. 创建父工程的pom.xml文件

Maven多模块管理,其实就是让它的子模块的pom文件继承父工程的pom文件。

重点:Maven父工程必须遵循以下两点要求

  • packaging标签的文本内容必须设置为pom
  • 把src目录删除掉
  • 只是简单额留下一个pom.xml文件

父工程的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.yunbocheng</groupId>
    <artifactId>Maven-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Maven</module>
    </modules>
    <pcakaging>pom</pcakaging>
    <!-- 父工程要加强管理子模块的所有依赖 
        作用:让子工程选择性的来继承父工程pom.xml文件中的依赖
            这样可以避免大量依赖文件的浪费。
            子类只需要指定引入依赖的 groupId、artifactId即可
            而版本则使用父pom.xml中定义的这个版本号。
    -->
    <dependencyManagement>
    <!-- 在父工程中给定项目所要用到的依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>
  </dependencyManagement>
    <!-- 声明JDK的版本 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>
复制代码
  1. 创建子工程,这个子工程继承这个父工程的pom.xml文件

注意:在创建子工程的时候,需要继承父工程

微信截图_20220610143824.png

继承此父工程的pom.xml文件,此时的子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">
    <!-- 指向父工程的GAV坐标 -->
    <parent>
        <artifactId>Maven-parent</artifactId>
        <groupId>com.yunbocheng</groupId>
        <version>1.0-SNAPSHOT</version>
        <!-- 给定继承父工程的pom.xml路径信息 -->
        <relativePath>../Maven多模块继承/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <!-- 此时只能指定子类的工程名,版本号以及工程的路径要和父工程保持一致。
        这样才可以获取到其中的父工程pom.xml文件。
    -->
    <artifactId>Maven-childs</artifactId>
    <!-- 使用父工程中的依赖 -->
    <!--- 不需要指定版本号,只需要指定名称以及位置即可。
          子模块依赖的版本号继承父工程的版本号。这样就不会造成版本号的冲突。
    -->
    <dependencies>
      <dependency>
         <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <!-- 当子类指定特定的版本号的时候,此时就不会继承父工程的版本号-->
         <version>2.7.1</version>
      </dependency>
    </dependencies>
    <!-- 声明JDK的版本 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>
复制代码

此时子工程引用的就是父工程的pom.xml中的依赖。

注意:当我们创建的时候忘记选择的时候,还可以手动添加这个父工程依赖。


1.3.2 父工程的最终管理


父工程最终管理的就是依赖的版本号

<?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">
    <!-- Maven模块的版本号 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 组织id -->
    <groupId>com.yunbocheng</groupId>
    <!-- 项目名 -->
    <artifactId>Maven-parent</artifactId>
    <!-- 版本号码 -->
    <version>1.0-SNAPSHOT</version>
    <!--
        打包方式:pom、jar、war
        pom是给父项使用的,父项目用作项目的整合,maven install 之后,不会生成jar包或者war包。
        jar:打包java项目使用的。是默认的打包方式。如果不给定packaging标签属性,就会打包为jar包
        war:打包web项目使用。不过现在SpringBoot一般情况下也打包成jar包
    -->
    <packaging>pom</packaging>
    <!-- 项目名称,maven生成文档用到,只起到说明的作用-->
    <name>${project.artifactId}</name>
    <!-- 同上,声明该pom.xml文件的地址 -->
    <url>https://github.com/pnoker/iot-dc3</url>
    <!-- 同上,成立年份-->
    <inceptionYear>2017-2020</inceptionYear>
    <!-- 针对该pom.xml文件的描述 -->
    <description>
        针对多模块之间继承的父工程。实现分布式的功能。
    </description>
    <!-- 声明继承该父工程的子工程 -->
    <modules>
        <module>dc3-gateway</module>
        <module>dc3-center</module>
        <module>dc3-transfer</module>
        <module>dc3-driver</module>
        <module>dc3-api</module>
        <module>dc3-common</module>
    </modules>
    <!-- properties中声明的是该工程的最提参数值 -->
    <properties>
        <!-- Maven依赖的JDK版本号 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!-- 父管理依赖其实就是管理依赖的版本号 -->
        <!-- 这个版本号的标签是自定义的:一般是项目名称(artifactId)+字段version -->
        <!-- 语法为两种:项目名称.version 或者 项目名称-version -->
        <dubbo-version>2.6.2</dubbo-version>
        <lombok.version>1.18.22</lombok.version>
        <spring-boot-starter-test.version>2.6.2</spring-boot-starter-test.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <mybatis.plus.version>3.3.2</mybatis.plus.version>
    </properties>
    <!-- 实际导入的依赖,子模块将会继承这些依赖,
         这种定义的方式缺点是:任何一个子模块一定会继承这些依赖
                           子模块不能进行选择性的继承哪些依赖。
    -->
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <!-- 使用EL表达式来获取这个依赖的版本号 -->
            <version>${dubbo-version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <!-- 使用EL表达式来获取这个依赖的版本号 -->
            <version>${lombok.version}</version>
        </dependency>
        <!-- Test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${spring-boot-starter-test.version}</version>
            <!--
                scope表示一个以来的作用范围,通常有一下几个取值
                    compile:默认值, 表示参与项目构建的一切流程
                    test: 仅仅测试阶段用到,项目打包的时候不会打包进去
                    runtime: 与compile相比,不参与编译,其他过程例如运行、测试等都参与。
                    provided: 但是打包的时候不包括他,其他所有流程都参与。
                    system:  和 systemPath一起用,从本地加载依赖。 作用范围和provided一样。
            -->
            <scope>test</scope>
            <!--
                exclusions 把不需要的部分排除在外
                     比如springboot不需要内置的tomcat时,就可以用这个排除
            -->
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!-- 依赖管理,这个是依赖管理的加强。
         区别于上面的dependencies,dependencyManagement只是“定义依赖”,并没有实际引入。
         他的作用是提前定义版本号,子模块需要引入jar包时,就不需要再加版本了。
         在 dependencyManagement 标签中声明的依赖。子模块可以选择性的继承,不必全部的继承。
     -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Mybatis Plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis.plus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-extension</artifactId>
                <version>${mybatis.plus.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--配置一些插件-->
    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
        </plugin>
    </plugins>
    </build>
    <!-- 开发者信息 -->
    <developers>
        <developer>
            <id>yunbocheng</id>
            <name>yunbocheng</name>
            <email>2484720940@qq.com</email>
            <organization>https://github.com/yunbocheng</organization>
        </developer>
    </developers>
    <!-- 项目使用的协议 -->
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <!-- 打包上传到私服或者github, 需要和配置文件中的server节点配合使用 -->
    <distributionManagement>
        <repository>
            <id>github</id>
            <name>GitHub DC3 Apache Maven Packages</name>
            <url>https://maven.pkg.github.com/pnoker/iot-dc3</url>
        </repository>
    </distributionManagement>
</project>


子模块还会无条件的继承父模块中的插件。

以上就是针对Maven多模块管理的一个操作以及针对pom.xml文件中内容的一个分析。

相关文章
|
6月前
|
Java Maven Spring
94分布式电商项目 - Maven Profile切换注册中心连接配置
94分布式电商项目 - Maven Profile切换注册中心连接配置
26 0
|
6月前
|
Java 数据库连接 Maven
93分布式电商项目 - Maven Profile切换数据库连接配置
93分布式电商项目 - Maven Profile切换数据库连接配置
37 0
|
6月前
|
Java 测试技术 Maven
92分布式电商项目 - Maven Profile
92分布式电商项目 - Maven Profile
29 0
|
8月前
|
Java 关系型数据库 MySQL
微服务中基于Spring Boot的maven分布式项目框架的搭建(三)
微服务中基于Spring Boot的maven分布式项目框架的搭建
|
8月前
|
JSON Java 数据库连接
微服务中基于Spring Boot的maven分布式项目框架的搭建(二)
微服务中基于Spring Boot的maven分布式项目框架的搭建
|
8月前
|
Java 关系型数据库 MySQL
微服务中基于Spring Boot的maven分布式项目框架的搭建(一)
微服务中基于Spring Boot的maven分布式项目框架的搭建
|
Dubbo Java 应用服务中间件
SpringBoot——借助Maven多模块管理实现集成SSM、Dubbo、Thymeleaf的汇总案例
SpringBoot——借助Maven多模块管理实现集成SSM、Dubbo、Thymeleaf的汇总案例
SpringBoot——借助Maven多模块管理实现集成SSM、Dubbo、Thymeleaf的汇总案例
|
29天前
|
Java Maven
手把手教你搭建Maven项目
手把手教你搭建Maven项目
28 0
|
2月前
|
Java Maven
java修改当前项目的maven仓库地址为国内
修改当前项目的maven仓库地址为国内