👨🎓作者:Java 学术趴
🏦仓库:Github、Gitee
✏️博客:CSDN、掘金、InfoQ、云+社区
💌公众号:Java 学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号 Java 学术趴联系小编。
☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!
👋大家好!我是你们的老朋友 Java 学术趴,今天给大家分享一下分布式开发中必备的技能。Maven 的多模块管理。所谓 Maven 的多模块管理其实:子模块继承父模块的 Maven 依赖,这样在多模块开发之下,多个模块的依赖版本就是一样的,这样就不会造成因模块依赖的版本不同而造成的冲突。其实 Mavne 管理的就是依赖的版本号。
这里我们普及一个概念:什么是分布式
Maven 多模块管理应用
1.1 场景描述
commonModel:提供公共的基础服务,比如工具类、常量类等
bussinessModel:业务模块,是系统真正要实现的业务,依赖于 common 模块,比如订单管理、财务统计、会员管理等。
application:可发布的 web 应用,由各个 bussinessModel 组成,最终满足项目整体需求
第三方模块:包含各类框架,Spring、MyBatis、日志等。整个应用都是依赖他们完成开发的。
1.2 使用多模块管理的意义
有 pom.xml 文件的一定是 Mavne 工程,没有 pom.xml 文件的一定不是 Maven 工程
pom 叫做项目对象模型:(Project Object Module)。该文件是可以被子工程继承的。
1.3 第一种方式:创建 Maven 父工程
1.3.1 展示子功能继承父工程
创建父工程的 pom.xml 文件
Maven 多模块管理,其实就是让它的子模块的 pom 文件继承父工程的 pom 文件。
重点:Maven 父工程必须遵循以下两点要求
父工程的 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>
复制代码
创建子工程,这个子工程继承这个父工程的 pom.xml 文件
注意:在创建子工程的时候,需要继承父工程
继承此父工程的 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 文件中内容的一个分析。
评论