当前位置: 首页 > article >正文

【Maven】继承和聚合

5. Maven的继承和聚合

5.1 什么是继承

Maven 的依赖传递机制可以一定程度上简化 POM 的配置,但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本且这些模块之间不存在依赖关系,这就导致同一个依赖需要在多个模块中重复声明,这显然是不可取的,大量的前人经验告诉我们,重复往往意味着更多的劳动和更高的潜在风险。

请添加图片描述

在 Java 面向对象中,我们可以建立一种类的父子结构,然后在父类中声明一些字段和方法供子类继承,这样就可以一定程度上消除重复,做到 “一处声明,多处使用”。在 Maven 的世界中,也有类似的机制,它就是 POM 继承。

Maven 在设计时,借鉴了 Java 面向对象中的继承思想,提出了 POM 继承思想。当一个项目包含多个模块时,可以在该项目中再创建一个父模块,并在其 POM 中声明依赖,其他模块的 POM 可通过继承父模块的 POM 来获得对相关依赖的声明。

对于父模块而言,其目的是为了消除子模块 POM 中的重复配置,其中不包含有任何实际代码,因此父模块 POM 的打包类型(packaging)必须是 pom。

请添加图片描述

子工程可以继承的父工程的元素:

在这里插入图片描述

properties 示例:

演示一:在父模块下创建 JavaSE 子模块

1、创建 maven_fu 模块,作为父模块。因为父模块不提供代码,所以删除 src 目录,在父模块下只保留 pom.xml 文件。

2、在 maven_fu 模块的 pom.xml 文件中使用 定义好依赖;使用 定义好插件。

3、创建 JavaSE 模块 maven_zi_javase,在模块中引入依赖。

测试结果如下图:

  • 在父工程中,使用 统一指定依赖的版本。
  • 在子模块 maven_zi_javase 中直接使用 G、A 引入依赖,不需要指定 V。
  • 父工程只负责声明依赖,不会实际引入依赖。

请添加图片描述

演示二:在父模块下创建 Java Web 子模块

1、在 maven_fu 模块的 pom.xml 文件中添加 servlet 依赖。

2、创建 Java Web 模块 maven_zi_javaweb,在模块中引入 servlet 依赖。
请添加图片描述

3、在 maven_zi_javaweb 模块的插件中运行 tomcat7:run
请添加图片描述

4、浏览器访问:
请添加图片描述

总结:一句话,通过继承可以实现子工程沿用父工程的配置,大大减少重复设置。

5.2 什么是聚合

使用 Maven 聚合功能对项目进行构建时,需要在该项目中额外创建一个的聚合模块,然后通过这个模块构建整个项目的所有模块。聚合模块仅仅是帮助聚合其他模块的工具,其本身并无任何实质内容,因此聚合模块中只有一个 POM 文件,不包含 src 等目录。

与父模块相似,聚合模块的打包方式(packaging)也是 pom,用户可以在其 POM 中通过 modules 下的 module 子元素来添加需要聚合的模块的目录路径。父模块的 pom.xml 文件的 把子模块聚集起来。

示例一:具有父子关系的项目中,可以直接在父模块中执行构建流程

maven_fu 有 2 个子模块 maven_zi_javase 和 maven_zi_javaweb。直接在 maven_fu 的生命周期里执行构建流程,也会应用到子模块中:

1、在 maven_fu 中执行 package
请添加图片描述

2、子模块成功打包:
请添加图片描述

示例二:在无依赖关系的模块间,使用聚合实现统一构建

1、创建聚合模块 0_maven_juhe,模块内只保留 pom.xml 文件。

2、创建 JavaSE 模块 1_maven_javase,模块内只保留 pom.xml 文件,创建子模块 1_maven_javase_zi。

3、创建 JavaWeb模块 2_maven_javaweb。

4、在 0_maven_juhe 的 pom.xml 文件中指定打包方式为 pom;通过 modules 标签指定需要聚合的模块。

请添加图片描述

执行 package 命令,查看打包情况:

请添加图片描述

具体构建流程如下:

C:\Softwares\Developer_Kits\JDK\jdk1.8.0_131\bin\java.exe -Dmaven.multiModuleProj ......
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] 1_maven_javase                                                     [pom] // JavaSE模块
[INFO] 1_maven_javase_zi                                                  [jar] // JavaSE模块的子模块
[INFO] 2_maven_javaweb Maven Webapp                                       [war] // JavaWeb模块
[INFO] 0_maven_juhe                                                       [pom] // 聚合模块
[INFO] 
[INFO] --------------------< cn.myphoenix:1_maven_javase >---------------------
[INFO] Building 1_maven_javase 1.0-SNAPSHOT                               [1/4]
[INFO]   from ..\1_maven_javase\pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] -------------------< cn.myphoenix:1_maven_javase_zi >-------------------
[INFO] Building 1_maven_javase_zi 1.0-SNAPSHOT                            [2/4]
[INFO]   from ..\1_maven_javase\1_maven_javase_zi\pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ 1_maven_javase_zi ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ 1_maven_javase_zi ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ 1_maven_javase_zi ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\1_maven_javase\1_maven_javase_zi\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ 1_maven_javase_zi ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ 1_maven_javase_zi ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ 1_maven_javase_zi ---
[INFO] Building jar: C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\1_maven_javase\1_maven_javase_zi\target\1_maven_javase_zi-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --------------------< cn.myphoenix:2_maven_javaweb >--------------------
[INFO] Building 2_maven_javaweb Maven Webapp 1.0-SNAPSHOT                 [3/4]
[INFO]   from ..\2_maven_javaweb\pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ 2_maven_javaweb ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ 2_maven_javaweb ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ 2_maven_javaweb ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\2_maven_javaweb\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ 2_maven_javaweb ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ 2_maven_javaweb ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ 2_maven_javaweb ---
[INFO] Packaging webapp
[INFO] Assembling webapp [2_maven_javaweb] in [C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\2_maven_javaweb\target\2_maven_javaweb]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\2_maven_javaweb\src\main\webapp]
[INFO] Webapp assembled in [33 msecs]
[INFO] Building war: C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\2_maven_javaweb\target\2_maven_javaweb.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO] 
[INFO] ---------------------< cn.myphoenix:0_maven_juhe >----------------------
[INFO] Building 0_maven_juhe 1.0-SNAPSHOT                                 [4/4]
[INFO]   from pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for 0_maven_juhe 1.0-SNAPSHOT:
[INFO] 
[INFO] 1_maven_javase ..................................... SUCCESS [  0.000 s]
[INFO] 1_maven_javase_zi .................................. SUCCESS [  0.832 s]
[INFO] 2_maven_javaweb Maven Webapp ....................... SUCCESS [  0.386 s]
[INFO] 0_maven_juhe ....................................... SUCCESS [  0.000 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.311 s
[INFO] Finished at: 2024-11-27T20:02:00+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

思考:继承和聚合很相似,只是继承具有依赖关系,而聚合是统一构建毫无关系的模块。

总结:一句话,聚合就是集中构建项目的。


http://www.kler.cn/a/418300.html

相关文章:

  • Git命令大全(超详细)
  • 【Android】组件化嘻嘻嘻gradle耶耶耶
  • 【最新鸿蒙开发——应用导航设计】
  • ECharts柱状图-交错正负轴标签,附视频讲解与代码下载
  • 力扣刷题TOP101:8.BM10 两个链表的第一个公共结点
  • Mysql高可用架构方案
  • skywalking 配置elasticsearch持久化
  • Git 教程
  • 【前端入门】文档流相关概念
  • LeetCode Hot100 11~20
  • 服务器创建容器时报错: no main manifest attribute
  • 【Redis篇】Hash的认识以及相关命令操作
  • wireshark基础
  • 智能化业务校验框架:动态设计与应用实践
  • 群控系统服务端开发模式-补充程序草图设计
  • Android 亮度调节
  • Unity3D UI 嵌套滚动视图
  • md5介绍及java实现
  • 增长比 C语言
  • 理解字母形状,从而获得含义
  • TypeScript核心语法(2)——基本用法
  • Midjourney Describe API 的对接和使用
  • Maven 常用命令
  • 计算机视觉:从核心算法到实际应用的全面解析
  • 【热门主题】000077 物联网智能项目:开启智能未来的钥匙
  • axios的认识与基本使用