Maven提高篇系列之一——多模块 vs 继承

Maven自定义脚手架(多module模块)+自定义参数 脚手架创建的步骤如下,先创建一个工程,把常用的代码写好,进入工程根目录,进行如下操作:打包模板进入模板目录,修改文件配置如果想让文件中的替换变量生效,需要先修改META-INF.maven/archetype-metadata.xml将对应目录或文件增加 filtered=“true”再使用变量替换对应文件内容部署本地上传仓库mvn deploy下面用一个多模块的项目做演示,包含xml文件,yml文件,和其他文件。 阅读详情

感谢无知者云的博客,写的很好的Maven提高篇的文章

http://www.davenkin.me/post/2013-08-03/create-multi-module-maven-project


通常来说,在Maven的多模块工程中,都存在一个pom类型的工程作为根模块,该工程只包含一个pom.xml文件,在该文件中以模块(module)的形式声明它所包含的子模块,即多模块工程。在子模块的pom.xml文件中,又以parent的形式声明其所属的父模块,即继承。然而,这两种声明并不必同时存在,我们将在下文中讲到这其中的区别。

 

 

(一)创建Maven多模块工程


多模块的好处是你只需在根模块中执行Maven命令,Maven会分别在各个子模块中执行该命令,执行顺序通过Maven的Reactor机制决定。先来看创建Maven多模块工程的常规方法。在我们的示例工程中,存在一个父工程,它包含了两个子工程(模块),一个core模块,一个webapp模块,webapp模块依赖于core模块。这是一种很常见的工程划分方式,即core模块中包含了某个领域的核心业务逻辑,webapp模块通过调用core模块中服务类来创建前端网站。这样将核心业务逻辑和前端展现分离开来,如果之后决定开发另一套桌面应用程序,那么core模块是可以重用在桌面程序中。

 

首先通过Maven的Archetype插件创建一个父工程,即一个pom类型的Maven工程,其中只包含一个pom.xml文件:

 

mvn archetype:generate -DgroupId=me.davenkin -DartifactId=maven-multi-module -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root -DinteractiveMode=false

 

以上命令在当前目录下创建了一个名为maven-multi-module的目录,该目录便表示这个pom类型的父工程,在该目录只有一个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/xsd/maven-4.0.0.xsd">

 <modelVersion>4.0.0</modelVersion>

 <groupId>me.davenkin</groupId>

 <artifactId>maven-multi-module</artifactId>

 <version>1.0-SNAPSHOT</version>

 <packaging>pom</packaging>

 <name>maven-multi-module</name>

</project>

 

这个pom.xml非常简单,最值得一看的是其中的“<packaging>pom</packaging>”,表示该工程为pom类型。其他的Maven工程类型还有jar、war、ear等。

 

此时,父工程便创建好了,接下来我们创建core模块,由于core模块属于maven-multi-module模块,我们将工作目录切换到maven-multi-module目录下(当然你也可以不用,只是需要一些额外的配置),创建core模块命令如下:

 

mvn archetype:generate -DgroupId=me.davenkin -DartifactId=core  -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

 

这里我们使用了Archetype插件的maven-archetype-quickstart,它创建一个jar类型的模块。此时,如果我们在打开maven-multi-module模块的pom.xml会发现,其中多了以下内容:

 

 <modules>

   <module>core</module>

 </modules>

 

这里的core即是我们刚才创建的core模块,再看看core模块中的pom.xml文件:

 

<?xml version="1.0"?>

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <modelVersion>4.0.0</modelVersion>

 <parent>

   <artifactId>maven-multi-module</artifactId>

   <groupId>me.davenkin</groupId>

   <version>1.0-SNAPSHOT</version>

 </parent>

 <groupId>me.davenkin</groupId>

 <artifactId>core</artifactId>

 <version>1.0-SNAPSHOT</version>

 <name>core</name>

 <url>http://maven.apache.org</url>

 <dependencies>

   <dependency>

     <groupId>junit</groupId>

     <artifactId>junit</artifactId>

     <version>3.8.1</version>

     <scope>test</scope>

   </dependency>

 </dependencies>

</project>

 

请注意里面的  “<parent>...  </parent>”,它将maven-multi-module模块做为了自己的父模块。这里我们看出,当创建core模块时,Maven将自动识别出已经存在的maven-multi-module父模块,然后分别创建两个方向的指引关系,即在maven-multi-module模块中将core作为自己的子模块,在core模块中将maven-multi-module作为自己的父模块。要使Maven有这样的自动识别功能,我们需要在maven-multi-module目录下创建core模块(请参考前文),不然,core模块将是一个独立的模块,但是我们可以通过手动修改两个模块中的pom.xml文件来创建他们之间的父子关系,从而达到同样的目的。

 

依然在maven-multi-module目录下,通过与core相同的方法创建webapp模块:

 

mvn archetype:generate -DgroupId=me.davenkin -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

 

这里的maven-archetype-webapp表明Maven创建的是一个war类型的工程模块。此时再看maven-multi-module模块的pom.xml文件,其中的<modules>中多了一个webapp模块:

 

<modules>

   <module>core</module>

   <module>webapp</module>

 </modules>

 

而在webapp模块的pom.xml文件中,也以 “<parent>...  </parent>”的方式将maven-multi-module模块声明为自己的父模块,这些同样是得益于Maven自动识别的结果。

 

此时,在maven-multi-module目录下,我们执行以下命令完成整个工程的编译、打包和安装到本地Maven Repository的过程:

 

mvn clean install

 

 

(二)手动添加子模块之间的依赖关系

此时我们虽然创建了一个多模块的Maven工程,但是有两个问题我们依然没有解决:

 

(1)没有发挥Maven父模块的真正作用

(2)webapp模块对core模块的依赖关系尚未建立

 

针对(1),Maven父模块的作用本来是使子模块可以继承并覆盖父模块中的配置,比如dependency等,但是如果我们看看webapp和core模块中pom.xml文件,他们都声明了对Junit的依赖,而如果多个子模块都依赖于相同的类库,我们应该将这些依赖配置在父模块中,继承自父模块的子模块将自动获得这些依赖。所以接下来我们要做的便是:将webapp和core模块对junit的依赖删除,并将其迁移到父模块中。

 

对于(2),Maven在创建webapp模块时并不知道webapp依赖于core,所以这种依赖关系需要我们手动加入,在webapp模块的pom.xml中加入对core模块的依赖:

 

       <dependency>

           <groupId>me.davenkin</groupId>

           <artifactId>core</artifactId>

           <version>1.0-SNAPSHOT</version>

       </dependency>

 

此时再在maven-multi-module目录下执行 “mvn clean install”,Maven将根据自己的Reactor机制决定哪个模块应该先执行,哪个模块应该后执行。比如,这里的webapp模块依赖于core模块,那么Maven会先在core模块上执行“mvn clean install”,再在webapp模块上执行相同的命令。在webapp上执行“mvn clean install”时,由于core模块已经被安装到了本地的Repository中,webapp便可以顺利地找到所依赖的core模块。

 

总的来看,此时命令的执行顺序为maven-multi-module -> core -> webapp,先在maven-multi-module上执行是因为其他两个模块都将它作为父模块,即对它存在依赖关系,又由于core被webapp依赖,所以接下来在core上执行命令,最后在webapp上执行。

 

这里又有一个问题:为什么非得在maven-multi-module目录下执行 “mvn clean install”?答案是,并不是非得如此,只是你需要搞清楚Maven的工作机制。在maven-multi-module目录下执行,即是在父工程中执行,此时Maven知道父模块所包含的所有子模块,并会自动按照模块依赖关系处理执行顺序。如果只在子模块中执行,那么Maven并不知道它对其他模块的依赖关系。举个例子,当在webapp中执行 “mvn clean install”,Maven发现webapp自己依赖于core,此时Maven只会在本地的Repository中去找core,如果存在,那么你很幸运,如果不存在,那么对不起,运行失败,说找不到core,因为Maven并不会先将core模块安装到本地Repository。此时你需要做的是,切换到core目录,执行“mvn clean install”将core模块安装到本地Repository,再切换回webapp目录,执行“mvn clean install”,万事才大吉。

 

多么繁琐的步骤,此时你应该能体会到在maven-multi-module下执行Maven命令的好处了吧。总结一下:在maven-multi-module下执行“mvn clean install”, Maven会在每个模块上执行该命令,然后又发现webapp依赖于core,此时他们之间有一个协调者(即父工程),它知道将core作为webapp的依赖,于是会先在core模块上执行“mvn clean install”,当在webapp上执行命令时,无论此时的core模块是否存在于本地Repository中,父工程都能够获取到core模块(如果不存在于本地Repository,它将现场编译core模块,再将其做为webapp的依赖,比如此时使用“mvn clean package”也是能够构建成功的),所以一切成功。

 

这里又牵扯到Maven如何查找依赖的问题,简单来说,Maven会先在本地Repository中查找依赖,如果依赖存在,则使用该依赖,如果不存在,则通过pom.xml中的Repository配置从远程下载依赖到本地Repository中。默认情况下,Maven将使用Maven Central Repository作为远端Repository。于是你又有问题了:“在pom.xml中为什么没有看到这样的配置信息啊?”原因在于,任何一个Maven工程都默认地继承自一个Super POM,Repository的配置信息便包含在其中。

 

 

(三)多模块 vs 继承


在文章一开始我们便提到,在Maven中,由多模块(由上到下)和继承(由下到上)关系并不必同时存在。

 

(1)如果保留webapp和core中对maven-multi-module的父关系声明,即保留 “<parent>...  </parent>”,而删除maven-multi-module中的子模块声明,即“<modules>...<modules>”,会发生什么情况?此时,整个工程已经不是一个多模块工程,而只是具有父子关系的多个工程集合。如果我们在maven-multi-module目录下执行“mvn clean install”,Maven只会在maven-multi-module本身上执行该命令,继而只会将maven-multi-module安装到本地Repository中,而不会在webapp和core模块上执行该命令,因为Maven根本就不知道这两个子模块的存在。另外,如果我们在webapp目录下执行相同的命令,由于由子到父的关系还存在,Maven会在本地的Repository中找到maven-multi-module的pom.xml文件和对core的依赖(当然前提是他们存在于本地的Repository中),然后顺利执行该命令。

 

这时,如果我们要发布webapp,那么我们需要先在maven-multi-module目录下执行“mvn clean install”将最新的父pom安装在本地Repository中,再在core目录下执行相同的命令将最新的core模块安装在本地Repository中,最后在webapp目录下执行相同的命令完成最终war包的安装。麻烦。

 

(2)如果保留maven-multi-module中的子模块声明,而删除webapp和core中对maven-multi-module的父关系声明,又会出现什么情况呢?此时整个工程只是一个多模块工程,而没有父子关系。Maven会正确处理模块之间的依赖关系,即在webapp模块上执行Maven命令之前,会先在core模块上执行该命令,但是由于core和webapp模块不再继承自maven-multi-module,对于每一个依赖,他们都需要自己声明,比如我们需要分别在webapp和core的pom.xml文件中声明对Junit依赖。

 

综上,多模块和父子关系是不同的。如果core和webapp只是在逻辑上属于同一个总工程,那么我们完全可以只声明模块关系,而不用声明父子关系。如果core和webapp分别处理两个不同的领域,但是它们又共享了很多,比如依赖等,那么我们可以将core和webapp分别继承自同一个父pom工程,而不必属于同一个工程下的子模块。

SpringBoot多模块项目开发(Maven多模块项目) 在需要统一版本的位置,使用 ${自定义标签名} 引用声明的版本号。另外,自定义标签声明数据的配置并不是只能用于声明依赖的版本号,凡是需要统一声明后再引用的场合都可以使用,例如:统一配置项目构建的源码的字符集格式。xml复制代码。 阅读详情

相关推荐

maven】多 module项目搭建

文章目录1. 前言2. 单一 module 项目2.1. IDEA 创建项目2.2. maven 命令创建2.3. maven 项目结构3. 多 module 项目3.1. 创建顶层 module3.2. 添加子 module3.3. module 版本管理4. bom 项目5. 相关链接 1. 前言 本着 “ 干货的定义,往往都是基于某种特定场景 ” 的原则,开之前,先来点前戏: 只讲 ma...

仰起嘴角 1282

Maven 】花式玩法之多模块项目

Maven 通过使用插件和配置文件来定义项目的发布策略。项目的发布策略包括了构建、版本管理、部署和发布等方面的规则和流程。下面介绍一下Maven中常用的发布策略的定义方式:Maven多模块的发布使得项目的管理、构建和部署更加灵活、高效和可维护。它提供了一种组织和管理复杂应用程序的有效方式,同时也促进了代码的重用和模块的解耦,提高了开发团队的效率和项目的质量。提高了代码结构清晰度、可维护性,加快了部署速度,并促进了代码的复用。希望本文对您有所帮助。如果有任何错误或建议,请随时指正和提出。

2301_79456272的博客 2499

C# 与 PaddleOCR:一行代码实现高效图片文字识别的实战指南

本文介绍了如何使用 PaddleOCRSharp 进行图像文字识别,涵盖了从环境准备到高级功能的完整流程。首先,通过 NuGet 安装 PaddleOCRSharp 并下载预训练模型。接着,展示了单张图片识别的最小化示例和详细实现,包括模型配置、图片预处理和结果输出。进阶功能部分介绍了多语言和竖排文本识别的实现方法。此外,文章还提供了 WinForms 图形界面开发的完整示例,展示了如何通过界面加载图片、执行识别并展示结果。最后,探讨了批量处理优化策略,如并行处理多张图片以提高性能。通过这些步骤,开发者可以

墨夶的博客 978

Maven提高系列之(一)——多模块 vs 继承

这是一个Maven提高系列,包含有以下文章:    Maven提高系列之(一)——多模块 vs 继承Maven提高系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)Maven提高系列之(三)——使用自己的Repository(Nexus)Maven提高系列之(四)——使用ProfileMaven提高系列之(五)——处理依赖冲突Maven

tdeclipse的专栏 380

maven项目多模块

maven项目多模块

qq_43708315的博客 5229

6.Maven分模块开发

当dependency A自身的依赖B,与其他dependency存在冲突的时候(最常见的就是版本冲突),我们就需要把B排除掉,这时就需要使用exclusions元素。继承maven中很强大的一种功能,继承可以使子pom获得parent中的各项配置,对子pom进行统一的配置和依赖管理。多模块项目中,父模块打包类型必须是pom,同时以给出所有的子模块,其中每个module,都是另外一个maven项目。父pom是为了抽取统一的配置信息和依赖版本控制,方便子pom直接引用,简化子pom的配置。

相互学习 共同进步 1860

SpringBoot项目在不同环境下的配置以及打包方式

SpringBoot项目在不同环境下的配置以及打包方式一、概述二、配置文件的加载设置三、Maven不同环境的打包 一、概述 在我们平时的开发中,一个项目因为要上线,会有很多种环境,在不同的环境中我们项目的配置文件往往都是不一样的,比如数据库,Redis的那些配置,那我们怎么设置不用每次都进行修改呢? 由于上面的问题,我们直接配置三个配置文件,只需要打包的时候,根据不同环境打包不同的配置文件就好了,如下图 这三个文件中 application.yml 是启动服务时,Spring会自动加载的配置文件 ap

小怪的博客 3013

Java--Maven多模块管理

超大侧率 maven父工程必须遵循两点要求: 1、packaging标签的文本内容必须设置为pom 2、将src目录删除掉 一、空工程Empty Project设置 1、创建一个空工程Empty Project (1)File----New----Project,选择Empty Project,点击Next (2)输入工程名,以及存放路径 Project name:项目名称 Project location:项目存放位置路径 2、创建Maven父工程 (1)File----

MinggeQingchun的博客 6853

如何使用Maven创建多模块项目

使⽤maven 提供的多模块构建的特性完成maven 环境下多个模块的项⽬的管理与构建。这⾥以四个模块为例来搭建项⽬,以达到通俗易懂的初衷模块 maven_parent —– 基模块,就是常说的parent (pom)模块 maven_dao —– 数据库的访问层,例如jdbc操作(jar)模 块 maven_service —– 项⽬的业务逻辑层 (jar)模块 maven_controller —– ⽤来接收请求,响应数据 (war)

来都来了 3391

Maven环境下构建多模块项目

maven创建父子项目,希望对您有用,不足请补充指正! &&发奋识遍天下字,立志读尽人间书。----苏轼

L170311的博客 2232

Maven 多模块管理

多模块管理简单地理解就是一个 Java 工程项目中,会在不同的目录中有多个这样的文件,进而实现 Maven多模块管理在多人使用Maven协作开发项目时,尤其是稍微上点规模的项目,每个RD的工作都细分到具体功能和模块,。其中shop和admin需要单独部署,dao、service、util你可能想要一些经验丰富的人来维护,如果使用一个应用来管理的话,所有的功能和模块都会耦合在一起,所有人都可以随意修改代码,这显然不是我们所期望的。

m0_51448653的博客 1591

23、OpenMP常见用例与标准循环级示例详解

本文详细介绍了OpenMP的三种典型用例:循环级OpenMP、高级OpenMP和MPI+OpenMP,适用于不同层次的并行需求。重点讲解了循环级OpenMP在向量加法、流三元组和模板计算中的应用示例,并探讨了首次触摸优化、线程绑定、NUMA架构影响等关键性能优化策略。通过实际代码演示和性能分析,帮助开发者快速掌握OpenMP的基础并行化方法,并为后续高性能优化提供指导。

fanta的博客 63

声呐系统的Tonpilz型换能器阵列.rar_Tonpilz_comsol_仿真_声呐_水下阵列

声呐系统的Tonpilz型换能器阵列,适用于水下声呐波束仿真。

上一篇: 浅谈Maven和Git的原理以及在IDE中的使用
下一篇: 对于MyEclipse整合git上的maven项目导入
MrLittleCold
博客等级 码龄12年 2粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值