前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Maven高级篇——多模块管理

Maven高级篇——多模块管理

原创
作者头像
Java学术趴
发布2022-08-16 23:06:46
2.5K0
发布2022-08-16 23:06:46
举报
文章被收录于专栏:Java全栈·

👨‍🎓作者:Java学术趴 🏦仓库:GithubGitee ✏️博客:CSDN掘金InfoQ云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!

👋大家好!我是你们的老朋友Java学术趴,今天给大家分享一下分布式开发中必备的技能。Maven的多模块管理。所谓Maven的多模块管理其实:子模块继承父模块的Maven依赖,这样在多模块开发之下,多个模块的依赖版本就是一样的,这样就不会造成因模块依赖的版本不同而造成的冲突。其实Mavne管理的就是依赖的版本号。

这里我们普及一个概念:什么是分布式

  • 分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。分布式网络存储技术是将数据分散地存储于多台独立的机器设备上。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性可用性和扩展性。(这个定义来自于百度百科)

Maven多模块管理应用

1.1 场景描述

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

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

代码语言:javascript
复制
<?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文件

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

继承此父工程的pom.xml文件,此时的子pom.xml文件

代码语言:javascript
复制
<?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 父工程的最终管理

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

代码语言:javascript
复制
<?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文件中内容的一个分析。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Maven多模块管理应用
    • 1.1 场景描述
      • 1.2 使用多模块管理的意义
        • 1.3 第一种方式:创建Maven父工程
          • 1.3.1展示子功能继承父工程
          • 1.3.2 父工程的最终管理
      相关产品与服务
      云服务器
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档