一直对此问题好奇,正好有这兴致和时间,有必要了解一下。

所谓聚合项目,实际上就是对项目分模块

互联网项目一般来说按照业务分(订单模块、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-supportorm-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聚合工程的更多相关文章

  1. Maven的聚合工程(多模块工程)

    在开发2个以上模块的时候,每个模块都是一个 Maven Project.比如搜索平台,学习平台,考试平台.开发的时候可以自己管自己独立编译,测试,运行.但如果想要将他们整合起来,我们就需要一个聚合工程 ...

  2. Maven: 把聚合工程下的项目导入 Ecplise

    1.右键点击import 2.Import Existing Maven Projects 3.选择要导入的工程 4.完成

  3. 构建Maven聚合工程

    最近,准备构建一个Maven的项目,基于模块化的结构思想,决定使用Maven的聚合工程进行构建. 环境准备: (1)eclipse 这里推荐使用spring封装的eclipse(即STS) ,STS中 ...

  4. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  5. Jenkins+Docker部署Maven聚合工程

    这几天,把公司的预发布环境,改成docker部署,遇到了一些坑,有jenkins里的部署脚本的问题,也有harbor仓库的问题,还有docker远程访问的问题,还有DooD....一堆坑 Jenkin ...

  6. Maven聚合工程安装时排除掉不参与本次安装的子工程

    为解决本人在练习项目时的实际需求而做此记录: 在练习SSM项目时,通过Maven的聚合工程搭建了几个module,通过 health_parent 父工程进行管理,内有 healthmobile_we ...

  7. maven聚合工程无法install

    对于maven聚合工程,有时候执行maven命令进行mvn clean install时会出一些莫名奇妙的错误: 一直报告找不到符号,仔细看了项目源代码也不知道是什么原因.首先确保项目所在路径为英文路 ...

  8. Maven聚合工程的使用

    创建一个service模块 接下来,在该项目中创建一个接口 创建一个实现类,并实现接口 在sm1234-web项目中,调用service的方法,需要在该项目的pom.xml中引入依赖Service模块 ...

  9. 使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化

    一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...

  10. maven聚合工程使用如何debug

    maven聚合工程在正常情况下,使用debug时会出错,因为没有源码,就不会显示代码和断点行数条. 进行如下操作: 默认情况下source下只有默认的default文件夹,点击remove进行删除(这 ...

随机推荐

  1. binlog2sql 实战心得

    原创:binlog2sql在GitHub的地址:https://github.com/danfengcao/binlog2sql 作者:danfengcao 功能:从MySQL binlog解析出你要 ...

  2. 2.5基本算法之搜索 156:LETTERS

    #include<iostream>#include<cstdio>using namespace std;char a[21][21];bool b[26]; int X[4 ...

  3. JMeter参数化(二)--数据库参数化

    1.下载mysql驱动,解压得到mysql-connector-java-8.0.17.jar(驱动一般放在java的 \java\jre\lib\ext 路径下): 2.在 测试计划-->浏览 ...

  4. http请求的方法

    1.OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送'*'的请求来测试服务器的功能性. 2.HEAD 向服务器索要与GET请求相一致的相应,只不过响应体将不 ...

  5. 问题记录04:记录两种C#引用C++DLL报错的解决方法。

    两种C#引用C++DLL报错的解决方法 无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E) 解决方法:参考链接 试图加载格式不正确的 ...

  6. NO_PUBKEY 76F1A20FF987672F

    在ubuntu18.04上安装win时,执行sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic ...

  7. RabbitMQ service does not start due to corrupted mnesia database in RSA Security Analytics

    rabbitmq异常:mnesia database损坏

  8. windows下查找端口、PID、查找进程、杀死进程

    查找端口 netstat -ano|findstr "1099" TCP 0.0.0.0:1099 0.0.0.0:0 LISTENING 10120 TCP [::]:1099 ...

  9. Python第六章实验报告

    一.实验内容:<零基础学Python>第六章实例和实战,以及一道作业题 二.实验环境:IDLE Shell 3.9.7 三.实验目的和要求:掌握定义和调用函数.变量的作用域.匿名函数.参数 ...

  10. windows2012通过powershell安装远程组件技巧

    概要: 通过服务器管理器安装远程桌面服务会报错一直没有办法解决 之后了解到安装组件可以通过powershell命令安装   powershell命令说明 https://docs.microsoft. ...