[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进行删除(这 ...
随机推荐
- ESP32(WeMos D1 R32)开发资料
1.乐鑫官网 2.ESP32踩坑 ESP32控制摇杆,定义sw的引脚时一定要设置为上拉才行. 3.ESP32入门之arduino IDE环境搭建 4.ESP32 MicroPython编程官网文档 E ...
- Python pexpect 库的简单使用
一.Python pexpect 库的使用 在终端中许多命令都有与用户交互的场景,例如切换用户时需要手动输入密码,安装应用有时要输入默认配置等.这对 shell 自动化脚本十分不便.expect 命令 ...
- C语言初级阶段7——指针3
C语言初级阶段7--指针3 指针数组:描述的是一个数组,存储的是指针 #include<stdio.h> void fun(int(*arr)[2]) { for (int i = 0; ...
- Redis工具类 单机+集群
package com.irdstudio.basic.framework.redis.redisutil; import org.springframework.dao.DataAccessExce ...
- nodejs批量重命名
const fs = require("fs"); // directory path let config = { affix: null, src: null, }; ...
- AD使用积累 - 板子上开孔的方法
有时候画板子时需要需要在板子上开一些槽孔,可以参考如下两种方法: 第一种方法:封闭曲线转换为槽孔. 1.在机械层画一个封闭图形或者画一根线: 2.选中这个图形或线,选择工具 - 转换 - 以选中的元素 ...
- JVM调优学习笔记
TODO:需要学习的命令 jps jstat -gcutil pid xxxx jmap histo:live pid
- 1004 Counting Leaves (30分)
今天在热心网友的督促下完成了第一道PAT编程题. 太久没有保持训练了,整个人都很懵. 解题方法: 1.读懂题意 2.分析重点 3.确定算法 4.代码实现 该题需要计算每层的叶子节点个数,所以选用BFS ...
- C/C++ 数据结构使用数组实现队列的基本操作
//使用数组实现队列 #include <iostream> #include <Windows.h> using namespace std; #define MAXSIZE ...
- centos安装k8s注意点
安装方法,参考 https://blog.csdn.net/frankgy01/article/details/127936367 https://www.cnblogs.com/yangzp/p/1 ...