基于maven中多个子模块的构建顺序

 更新时间:2021年09月22日 14:56:44   作者:落魄的小开发  
这篇文章主要介绍了maven中多个子模块的构建顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

maven多个子模块的构建顺序

在实际的项目开发中,为了更好的组织项目代码,会采用分层架构的方式,这就会使用到maven的多模块特性。

假设项目分为A、B、C、D四层,在父模块的pom.xml中,一般这样来对子模块进行聚合

<modules>
    <module>A</module>
    <module>B</module>
    <module>C</module>
    <module>D</module>
</modules>

假设各个子模块间,配置的相互依赖关系如下:

A 依赖 B
B 依赖 C
D 依赖 A

构建父模块,我们能够看到以下输出:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] C
[INFO] B
[INFO] A
[INFO] D
[INFO]
[INFO] ------------------------------------------------------------------------

这是因为子模块的构建顺序受两个因素影响

  • 1、父模块中各子模块的声明次序
  • 2、子模块间的依赖关系

实际的构建顺序是这样形成的

maven按照次序读取pom,如果该pom没有依赖其他子模块,就构建该模块,否则就构建其依赖的模块,如果该依赖模块还依赖于其他的模块,那么就进一步构建依赖的依赖。

在示例中,A模块依赖B,而B模块又依赖C,因此要先构建C,再构建B,然后才能构建A。而D依赖的模块A已经构建了,因此直接构建它。

模块间的依赖关系会将反应堆(Reactor)构成一个有向非循环图,各个模块是该图的节点,依赖关系构成了有向边。这个图不允许出现循环。如果A依赖B,B又依赖A,这样就产生了循环依赖,Maven会报错。

maven中的构建

1.什么是构建

构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从 以下三个层面来看:

(1)纯 Java 代码 (编译)

大家都知道,我们 Java 是一门编译型语言,.java 扩展名的源文件需要编译成.class 扩展名的字节码 文件才能够执行。所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。

(2)Web 工程 (部署)

当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务 器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。我们可以将未编译的 Web 工程比喻为一只生的鸡,编译好的 Web 工程是一只煮熟的鸡,编译部署 的过程就是将鸡炖熟。

注意: 开发过程中使用路径或配置文件中配置的类路径等都是以编译结果的文件结构为标准。

(3)实际项目

在实际项目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 页面、图片等静态资源之外,还 包括第三方框架的 jar 包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服 务器上,项目才可以运行。

所以综上所述:构建就是以我们编写的 Java 代码、框架配置文件、国际化等其他资源文件、JSP 页 面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。

2.构建过程的几个主要环节

  • (1)清理:删除以前的编译结果,为重新编译做好准备。
  • (2)编译:将 Java 源程序编译为字节码文件。
  • (3)测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
  • (4)报告:在每一次测试后以标准的格式记录和展示测试结果。
  • (5)打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
  • (6)安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
  • (7)部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。

3.自动化构建

其实上述环节我们在 Eclipse 中都可以找到对应的操作,只是不太标准。那么既然 IDE 已经可以进 行构建了我们为什么还要使用 Maven 这样的构建工具呢?

我们来看一个小故事了解一下:

这是阳光明媚的一天。托马斯向往常一样早早的来到了公司,冲好一杯咖啡,进入了自己的邮箱——很 不幸,QA 小组发来了一封邮件,报告了他昨天提交的模块的测试结果——有 BUG。“好吧,反正也不是第一 次”,托马斯摇摇头,进入 IDE,运行自己的程序,编译、打包、部署到服务器上,然后按照邮件中的操作 路径进行测试。“嗯,没错,这个地方确实有问题”,托马斯说道。于是托马斯开始尝试修复这个 BUG,当他 差不多有眉目的时候已经到了午饭时间。 下午继续工作。BUG 很快被修正了,接着托马斯对模块重新进行了编译、打包、部署,测试之后确认没 有问题了,回复了 QA 小组的邮件。 一天就这样过去了,明媚的阳光化作了美丽的晚霞,托马斯却觉得生活并不像晚霞那样美好啊。

让我们来梳理一下托马斯这一天中的工作内容

在这里插入图片描述

从中我们发现,托马斯的很大一部分时间花在了“编译、打包、部署、测试”这些程式化的工作上 面,而真正需要由“人”的智慧实现的分析问题和编码却只占了很少一部分。

在这里插入图片描述

能否将这些程式化的工作交给机器自动完成呢?——当然可以!这就是自动化构建。

在这里插入图片描述

此时 Maven 的意义就体现出来了,它可以自动的从构建过程的起点一直执行到终点:

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java判断是否为闰年的方法示例

    Java判断是否为闰年的方法示例

    这篇文章主要介绍了Java判断是否为闰年的方法示例,本文直接给出示例代码,并讲解了判断原理,需要的朋友可以参考下
    2015-06-06
  • Java如何用一个统一结构接收成员名称不固定的数据

    Java如何用一个统一结构接收成员名称不固定的数据

    这篇文章主要为大家详细介绍了Java如何用一个统一结构接收成员名称不固定的数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • Java 中一个类提供一个默认对象的多种方法

    Java 中一个类提供一个默认对象的多种方法

    这篇文章主要介绍了Java 中一个类提供一个默认对象的多种方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java EasyExcel面向Excel文档读写逻辑示例详解

    java EasyExcel面向Excel文档读写逻辑示例详解

    这篇文章主要为大家介绍了java EasyExcel面向Excel文档读写逻辑示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Java中数组的定义与使用

    Java中数组的定义与使用

    下面小编就为大家带来一篇java中数组的定义与使用小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-10-10
  • java.Net.UnknownHostException异常处理问题解决

    java.Net.UnknownHostException异常处理问题解决

    这篇文章主要介绍了java.Net.UnknownHostException异常处理方法,问题原因是在系统的 /etc/Hostname中配置了主机名,而在/etc/hosts文件中没有相应的配置,本文给大家详细讲解,需要的朋友可以参考下
    2023-03-03
  • Java中WeakHashMap和HashMap的区别详解

    Java中WeakHashMap和HashMap的区别详解

    这篇文章主要介绍了Java中WeakHashMap和HashMap的区别详解,WeakHashMap和HashMap一样,WeakHashMap也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以为null,需要的朋友可以参考下
    2023-09-09
  • springboot自定义redis-starter的实现

    springboot自定义redis-starter的实现

    这篇文章主要介绍了springboot自定义redis-starter的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java设计模式之动态代理模式实例分析

    Java设计模式之动态代理模式实例分析

    这篇文章主要介绍了Java设计模式之动态代理模式,结合实例形式分析了动态代理模式的概念、功能、组成、定义与使用方法,需要的朋友可以参考下
    2018-04-04
  • Java Stream流之GroupBy的使用方式

    Java Stream流之GroupBy的使用方式

    本教程将详细介绍如何在 Java 中使用 Stream 流的 group by 方法,包括基本用法和一些常见的实际应用场景,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论