[Maven]Maven聚合工程
一直对此问题好奇,正好有这兴致和时间,有必要了解一下。
所谓聚合项目,实际上就是对项目分模块。
互联网项目一般来说按照业务分(订单模块、VIP模块、支付模块、CMS模块…);
传统的软件项目,大多采用分层的方式(Dao、Serivce、Controller):
1 聚合工程:实践案例篇


[demo]#1 多模块结构
bobo-parent pom 管理 (父聚合)
|-- bobo-manager pom 管理 (子聚合)
|-- bobo-manager-dao jar
|-- bobo-manager-service jar
|-- bobo-manager-model jar
|-- bobo-manager-commons jar
|-- bobo-manager-controller war (含controller/webapp)

1-1 项目结构
[demo]#2
现在项目越来越复杂,一般情况下,一个项目包括多个模块。
假设有个 orm 项目,包括2个子模块:orm-server和orm-support。
它们在文件系统的目录结构,如下所示
orm
--pom.xml
--orm -support
--src
--pom.xml
--orm -server
--src
--pom.xml
那么如何把它们聚合成一个多模块的maven项目配置呢?
1-2 项目的聚合: orm/pom.xml
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>orm</artifactId>
<version>0.1</version>
<packaging>pom</packaging>
<name>orm</name>
<description>The orm project of example</description>
<url>http://example.com</url>
<modules>
<module>orm-server</module>
<module>orm-support</module>
</modules>
这个聚合工程的pom.xml的配置关键在两点:
- (1)packaging类型为pom;
- (2)模块的引入。
<module>orchid-server</module>
表示在当前目录(也就是上面pom.xml所在目录)包括一个文件夹orchid-server。如果orchid-server和orchid在同一目录的话,那么配置应该是
<module>../orm-server</module>
1-3 项目的继承: orchid-server|orchid-support/pom.xml
在上面的例子中只有聚合,也就是说:
orm-support和orm-server是不知道有个总项目或者说父项目存在的,
因为我们没有在orm-support/pom.xml和orm-server/pom.xml中加入任何东西。
那么orm-support和orm-server也是不能从orchid项目继承任何东西的。
如果需要继承的话,那么需要在子项目的配置中加入<parent>配置:
- orm-support
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>orm</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>orm-support</artifactId>
- orm-server
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>orm</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>orm-server</artifactId>
上面两个配置在<parent>中都忽略了<relativePath>标签,<relativePath>的默认值是../pom.xml,也就是从父目录中寻找pom.xml。
如果你的父项目在其他地方,那么要手工加入改配置
<parent>
<groupId>com.stear.orchid</groupId>
<artifactId>orchid</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>parent project orchid directory/pom.xml</relativePath>
</parent>
这样子项目可以从父项目中继承元素。可继承的元素包括:
groupId
version
description
organization
inceptionYear
url
developers
contributors
distributionManagement
issueManagement
ciManagement
scm
mailingLists
properties
dependencies
dependencyManagement
repositories
build
reporting
2 聚合工程:理论篇
2-1 聚合配置

- 聚合工程(父工程)
[平行结构]
<groupId>com.example</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules> <!-- 本项目要聚合的三个子项目(模块) -->
<module>../a-subproject/module<module>
<module>../b-subproject/module<module>
<module>../c-subproject/module<module>
</modules>
[父子结构]
<groupId>com.example</groupId>
<artifactId>wechat</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules> <!-- 本项目要聚合的三个子项目(模块) -->
<module>wechat-pojo<module>
<module>wechat-web-manager<module>
<module>wechat-web-backend<module>
</modules>
- 被聚合工程(子工程)
<parent>
<groupId>com.example</groupId>
<artifactId>wechat</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<packaging>war(或jar)</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>wechat-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
[补充]web(controller)项目中,一般还可添加如下配置:
<dependencies>
<!-- 因为是web项目所以需要servlet -->
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 端口号 -->
<port>8082</port>
<!-- /表示访问路径 省略项目名 -->
<path>/</path>
<!-- 设置编码方式 -->
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
2-2 Why

2-3 What

2-4 打包方式

2-5 依赖管理/依赖传递


2-6 统一插件管理

3 聚合工程:延申问题?
3-1 Maven聚合工程的优势在哪里?
- 方便统一管理(依赖等)
- 更快构建,更快开发
- 项目整合:纵向切分+横向切分
首先,纵向切分,使项目结构更加清楚:将一个项目的多个功能模块分开;
然后,再对每个模块进行横向切分:
就是我们平常说的3层架构,将项目分成了web层(也被叫做表现层),service层(也被叫做业务层)、dao层(也被叫做持久层),可以理解为将一个功能模块的不同调用过程进行了水平方向的拆分。
最后,项目整合:横向拆分后,每个功能模块进行了单独的开发之,项目整合的时候只需要有一个能够整合这些项目或者模块的工程即可
X 参考文献
[Maven]Maven聚合工程的更多相关文章
- Maven的聚合工程(多模块工程)
在开发2个以上模块的时候,每个模块都是一个 Maven Project.比如搜索平台,学习平台,考试平台.开发的时候可以自己管自己独立编译,测试,运行.但如果想要将他们整合起来,我们就需要一个聚合工程 ...
- Maven: 把聚合工程下的项目导入 Ecplise
1.右键点击import 2.Import Existing Maven Projects 3.选择要导入的工程 4.完成
- 构建Maven聚合工程
最近,准备构建一个Maven的项目,基于模块化的结构思想,决定使用Maven的聚合工程进行构建. 环境准备: (1)eclipse 这里推荐使用spring封装的eclipse(即STS) ,STS中 ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- Jenkins+Docker部署Maven聚合工程
这几天,把公司的预发布环境,改成docker部署,遇到了一些坑,有jenkins里的部署脚本的问题,也有harbor仓库的问题,还有docker远程访问的问题,还有DooD....一堆坑 Jenkin ...
- Maven聚合工程安装时排除掉不参与本次安装的子工程
为解决本人在练习项目时的实际需求而做此记录: 在练习SSM项目时,通过Maven的聚合工程搭建了几个module,通过 health_parent 父工程进行管理,内有 healthmobile_we ...
- maven聚合工程无法install
对于maven聚合工程,有时候执行maven命令进行mvn clean install时会出一些莫名奇妙的错误: 一直报告找不到符号,仔细看了项目源代码也不知道是什么原因.首先确保项目所在路径为英文路 ...
- Maven聚合工程的使用
创建一个service模块 接下来,在该项目中创建一个接口 创建一个实现类,并实现接口 在sm1234-web项目中,调用service的方法,需要在该项目的pom.xml中引入依赖Service模块 ...
- 使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化
一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...
- maven聚合工程使用如何debug
maven聚合工程在正常情况下,使用debug时会出错,因为没有源码,就不会显示代码和断点行数条. 进行如下操作: 默认情况下source下只有默认的default文件夹,点击remove进行删除(这 ...
随机推荐
- jupyter nbconvert --to FORMAT xxx
$ jupyter nbconvert --to FORMAT notebook.ipynb This will convert the Jupyter notebook file notebook. ...
- XDZX2022学生博客链接
王桐林博客 https://www.cnblogs.com/xdzxtong/ 邢沐辰博客 https://www.cnblogs.com/xdzxmuchen/ 袁 博博客 https ...
- FCC 高级算法题 对称差分
Symmetric Difference 创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组. 给出两个集合 (如集合 A = ...
- C# 获取当前路径7种方法及输出
//获取模块的完整路径.string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;D:\wor ...
- golang RWMutex RLock重入导致死锁
现象 一个组件实现了raft分布式协议,在分布式部署环境中来进行选主,在某客户现场突然发生文件句柄泄露,在打印某些错误日志后,几个小时内没有日志打印,然后某个协程突然报无可用的文件句柄. 分析 经过代 ...
- 如何用算法把一个十进制数转为十六进制数-C语言基础
这一篇文章要探讨的是"如何用算法实现十进制转十六进制"并不涉及什么特别的知识点.属于C语言基础篇. 在翻找素材的时候,发现一篇以前写的挺有意思的代码,这篇代码里面涉及的知识点没有什 ...
- 【QT5】学习整理包含引用资料
视频学习资料 [[6天学会QT] 视频教程及QT5.11.1安装包安装方法][含代码]](https://www.bilibili.com/video/BV1hg4y1B7Vu?from=search ...
- input number类型去掉箭头和禁用滚轮
input number类型可以输入整型.浮点型.科学计数法的数据 禁用滚轮,在input标签内添加onmouseWheel="return false" <input ty ...
- 在.NET中使用JWT
1.配置文件添加 //jwt配置文件 "JWT": { "SigningKey": "14fa5f2rrwsg627fs256fdgff2r5rf52 ...
- IO题目
8-1 写入日志文件 (0 分) 编写程序,要求:用户在键盘每输入一行文本,程序将这段文本显示在控制台中.当用户输入的一行文本是"exit"(不区分大小写)时,程序将用户所有输 ...