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

目录
  • maven多个子模块的构建顺序
    • 这是因为子模块的构建顺序受两个因素影响
    • 实际的构建顺序是这样形成的
  • maven中的构建
    • 1.什么是构建
    • 2.构建过程的几个主要环节
    • 3.自动化构建

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 的意义就体现出来了,它可以自动的从构建过程的起点一直执行到终点:

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

(0)

相关推荐

  • IntelliJ IDEA 构建maven多模块工程项目(详细多图)

    食用前须知 本文以a b c 三个模块为例来搭建项目,以达到通俗易懂的初衷 模块a -– 基模块,就是人们常说的parent 模块b -– 其他模块都需要使用的一些工具,比如时间工具,json工具等 模块c -– 项目主要的内容,一般为聚合工程 先简单讲一下maven的一些特点 继承 这个可以理解为java中的继承类似,父类定义的东西,子类如果你想用就拿过来用就可以; 依赖 依赖就相当于我们java中的导包,二者有着异曲同工之妙; 你想用的东西只需要告诉maven它在哪就可以,它会自动帮你找过来

  • SpringBoot+Maven 多模块项目的构建、运行、打包实战

    本篇文章主要介绍了SpringBoot+Maven 多模块项目的构建.运行.打包,分享给大家,具体如下: 项目使用的工具: IntelliJ IDEA JDK 1.8 apache-maven-3.3.9 项目的目录: 主项目 springboot-multi 子模块 entity.dao.service.web 一.使用IDEA创建一个SpringBoot项目 : File -> new -> Project 项目名称为springboot-multi 二.删除项目中的src目录,把pom.

  • 详解使用Maven构建多模块项目(图文)

    Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理.尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块. 项目结构如下: test-hd-parent (父级) ---pom.xml ---test-hd-api (第三方接口层) ----pom.xml ---test-hd-foundation (基础工具层) ----pom.xml ---test-hd-resource (资源层) ----pom.xml -

  • maven多模块工程打包部署的方法步骤

    一般maven多模块工程结构如下图,图中分为dao数据层和上层web层(当然还可以有service层),在进行多模块划分的时候,一般将dao层采用jar进行打包,web层进行war打包.在进行war包部署时,发现dao是以jar包形式存在于lib包目录下,如果在部署服务器上需要进行相关配置修改会比较麻烦.因此研究了下用maven进行合并打包的方法: 1.确保dao pom.xml中有以下配置 <resources> <resource> <directory>${bas

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

    目录 maven多个子模块的构建顺序 这是因为子模块的构建顺序受两个因素影响 实际的构建顺序是这样形成的 maven中的构建 1.什么是构建 2.构建过程的几个主要环节 3.自动化构建 maven多个子模块的构建顺序 在实际的项目开发中,为了更好的组织项目代码,会采用分层架构的方式,这就会使用到maven的多模块特性. 假设项目分为A.B.C.D四层,在父模块的pom.xml中,一般这样来对子模块进行聚合 <modules> <module>A</module> <

  • 基于maven使用IDEA创建多模块项目

    鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDEA基于Maven创建多模块项目的实际开发,可能有不合适的地方,但是项目是可以跑通的,也请有不足之处,都提出来,一起讨论下. 一. 项目工程目录 首先展示一下,最终整个项目的工程目录: 简单介绍一下目录结构: common-parent为所有项目的父项目,主要用来管理所有项目使用的jar包及其版本. common-utils为公共的工具类项目,继承父项目,它会被打成jar包供其它项目使用. taotao-manager为我们自

  • java 基于maven多模块合并打包部署的操作过程

    目录 项目环境 项目结构 模块功能 模块间依赖关系 具体POM配置 顶级pom 项目环境 jdk 1.8 spring 2.7.x maven 3.6 项目结构 模块功能 client – 对外servicecommon – 共用工具切面等main – 启动类goods – 子模块具体实现 模块间依赖关系 client – 无依赖common – 无依赖main – client.common.goodsgoods – client.common 具体POM配置 顶级pom 引入需要被使用的所有

  • Java中基于maven实现zxing二维码功能

    maven所需jar <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifac

  • 基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查是否安装了pip 打开一个终端窗口,并执行如下命令: Python2.7中: zhuzhu@zhuzhu-K53SJ:~$ pip --version pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) Python3.X中: z

  • 基于TensorBoard中graph模块图结构分析

    在上一篇文章中,我们介绍了如何使用源码对TensorBoard进行编译教程,没有定制需求的可以直接使用pip进行安装. TensorBoard中的graph是一种计算图,里面的点用于表示Tensor本身或者运算符,图中的边则代表Tensor的流动或者控制关系. 本文主要从代码的层面,分析graph的数据来源与结构. 一般来说,我们在启动TensorBoard的时候会使用--logdir参数配置文件路径(或者设置数据库位置),这些日志文件为TensorBoard提供了数据.于是我们打开一个日志文件

  • 详解Spring与Mybatis整合方法(基于IDEA中的Maven整合)

    项目结构 项目路径可以自己定义,只要路径映射正确就可以 pom.xml <properties> <spring.version>5.1.5.RELEASE</spring.version> <mybatis.version>3.4.6</mybatis.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies&g

  • 基于idea Maven中的redis配置使用详解

    pom.xml文件需要的内容 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> &

  • 基于Pygame中Pygame模块的大战外星人实战

    目录 一,引言 二,主要内容 效果展示:  游戏介绍: 一,引言 开发环境:Pycharm 操作系统:Windows 10 Pyhon版本:3.9.9 需要自行安装Pygame 3(必须)和Python(必须). 由于多次引用背景参数,建议不要更改文中的背景参数.本文中的图片用的是相对引用的方式,如果和我图片位置放置不同的话需要设置绝对引用. 二,主要内容 主要代码片段: import sys import pygame # 调用pygame from settings import Setti

  • 基于Maven的pom.xml文件详解

    如下所示: <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/maven-v4_0_0.xsd "> <!-- 父项

随机推荐