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

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

互联网项目一般来说按照业务分(订单模块、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. latex常见的错误(自己经常出现的)

    1. undifned control consequence  有非法的命令---有可能没有导入对应的宏包.见latex常用的宏包. 2. See the amsmath package docum ...

  2. PVE联网及更换国内源

    一.PVE联网 第一次安装PVE,正常情况下PVE的IP是在我们上网的网段的.没有网络有可能是没有配置DNS服务器地址或DNS地址是软路由网关地址.解决方法有3种: 1:设置DHCP自动获取网络地址和 ...

  3. 使用idea从零编写SpringCloud项目-Feign

    ps:Fegin和Ribbon 其实是差不多的东西,Fegin里面也是集成了Ribbon,不过咱们写代码不是要优雅嘛,使用Feign就会优雅很多了,看着比直接使用Ribbon舒坦一点 就不重新构建项目 ...

  4. kubectl命令详解

    一.kubectl 基本命令 1.陈述式资源管理方法: 1.kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口 2.kubectl 是官方的CLI命令行工具,用 ...

  5. 【cs231n】knn作业笔记

    完成了assignment-1中knn相关内容的作业,记录一下遇到的知识点和问题 knn.ipynb的内容大致包括: 1.数据集的建立 主要是通过切片函数,如下图选取前5000张图片和其标记作为训练数 ...

  6. 多级路由,重定向之后,刷新页面报错问题:报错Unexpected token '<'

    使用脚手架:vue-cli3.0vue版本:vue3.0vue-router版本:vue-router4.0 配置多级路由,首次访问,到重定向页面没有问题,然后在当前页面刷新控制台报错:Unexpec ...

  7. error check

    #define SYSTEM_PRTCT_NOERR 0 #define SYSTEM_PRTCT_COVER (1 << 0) /* */#define SYSTEM_PRTCT_LPH ...

  8. CBV源码分析及模板语法之传值 过滤器 标签 继承 导入

    CBV的源码分析 # CBV的源码入口从哪里看呢? CBV的核心源码: return self.dispatch(request, *args, **kwargs) def dispatch(self ...

  9. DNS CNAME limitations cname 在哪些情况下不能配置

    https://www.rfc-editor.org/rfc/rfc1912.html https://www.rfc-editor.org/rfc/rfc2181.html 说明: domain n ...

  10. 使用yarn启用项目,报错无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系 统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。

    这是由于新版win10 安装的时候会出现: 解决 搜索powershell,右键以管理员身份运行 2.打开之后,执行命令set-ExecutionPolicy RemoteSigned更改 Power ...