Maven聚合
在实际的项目中,一个项目通常会划分为多个模块,为了说明问题,以用户登陆这个小web应用为例。通常一个web应用分为三个模块:
1. 模型和数据持久化层user-core,
2. 业务逻辑层user-service以
3. web展现层user-web,
user-service依赖于user-core
user-web依赖于user-core和user-service
这三个模块都是Maven项目(在Intellij Idea中称为Module),都有各自的pom.xml,如果我们单独管理这些模块,单独的编译、运行单元测试和打包,不仅很繁琐,而且不符合项目管理的理念,为了应对这种情况,Maven提供了maven模块聚合的功能
如何Maven聚合
1.Intellij Idea对Maven的支持
Intellij Idea中,Maven聚合是默认的,建立一个Maven项目(概念上类似于Eclipse的Workspace),取名叫user-project,那么这个项目包含一个pom.xml,这个项目就是用于Maven聚合。有了user-project这个Maven项目,可以为Maven项目添加Maven模块,这在Idea里可以在Project视图的项目名上点击右键,选择新建一个Maven模块,这里创建3个模块,user-core,user-service,user-web,每个模块有自己的pom文件。打开user-project的pom.xml文件,它的内容是
<?xml version="1.0" encoding="UTF-8"?>
<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>LearnMaven</groupId>
<artifactId>LearnMaven-user</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>user-core</module>
<module>user-service</module>
<module>user-web</module>
</modules>
</project>
这里确定几个问题:
1)jar,表示maven模块打包成jar包,这是默认值
2)war,表示maven模块打包成war包,
3)pom,表示maven模块不提供具体的输出,只用来做pom项目管理,这就以为它是一个聚合用的Maven项目
- project的modules,module用于指定要聚合哪些moven模块,这里有三个,user-core,user-service,user-web
-
module的值user-core,user-service,user-web,这些值从何而来,聚合项目如何知道去哪里找这些模块这个是根据目录来控制的,Maven聚合项目的pom.xml必定和user-core,user-service,user-web三个目录同级,
2.Eclipse的Maven支持
Eclipse的m2eclipse插件对Maven的支持远不如Intellij Idea对Maven的支持,这也是Intellij Idea流行起来的主要原因之一,在Eclipse中,只能建立四个平级的Maven项目
user-project
user-core
user-service
user-web
因为user-project的pom.xml跟user-core,user-service,user-web不在同一个目录下了,因此在user-project的pom.xml指定聚合模块的就需要指定上级目录
<?xml version="1.0" encoding="UTF-8"?>
<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>LearnMaven</groupId>
<artifactId>LearnMaven-user</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>../user-core</module>
<module>../user-service</module>
<module>../user-web</module>
</modules>
</project>
Maven继承
Maven聚合的目的是让Maven的聚合模块统一管理项目的各个maven模块,同样,这些被管理的maven模块可以继承这个聚合模块或者另外一个packaging为pom的maven模块(比如单独定义一个子模块,定义为user-parent), 这么做的好处是
1.在user-parent中定义项目的公共属性,这些属性在各个子模块中公用
2.项目各个模块依赖的依赖的版本,各个模块是一样的,就可以将它们集中到一起集中管理
3.使用<dependencyManagement><dependencies></dependencies></dependencyManagement>集中管理依赖,在子模块中的pom.xml中的依赖声明中只声明groupId和artifactId
maven模块声明继承另外一个maven模块
子模块的parent元素
<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">
<parent>
<artifactId>user-artifact</artifactId>
<groupId>user-project</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-core</artifactId>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
</project>
上面定义了,user-core这个模块继承自user-project这个聚合模块。同时,user-core依赖于slf4j,我们看到它的依赖包含了groupId,artifactId,version,如何省略version呢?
聚合模块(同时也是父模块)的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>user.project</groupId>
<artifactId>user.artifact</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>user.core</module>
<module>user.service</module>
<module>user-web</module>
</modules>
<properties>
<!--version constants for the dependents->
<slf4j.version>1.7.7</slf4j.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<!--The value is defined as property-->
<version>${slf4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
user-core模块的pom.xml定义
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>learn</artifactId>
<groupId>LearnProject</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-core</artifactId>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<!--No version is specified here,it inherits from its parent-->
</dependency>
</dependencies>
</project>
总结
1. 聚合和继承的关系
聚合模块(user-project)和继承模块(user-parent)可以是一个模块,也可以是两个独立的模块:
Intellij Idea中同一个模块的项目结构
user-project(user-parent)
user-core
user-service
user-web
Intellij Idea中两个模块的项目结构,Intellij Idea自动将user-parent聚合到user-project中,这其实是没有必要的
user-project
user-parent
user-core
user-service
user-web
Eclise中同一个模块的项目结构
user-project(user-parent)
user-core
user-service
user-web
Eclise中独立两个模块的项目结构
user-project
user-parent
user-core
user-service
user-web
user-project不必聚合user-parent,user-parent也不必继承自user-project,但是user-project聚合了user-core,user-service,user-web;user-core,user-service,user-web继承自user-parent。
相关推荐
** Maven基础入门 ** Maven是一个Java项目管理工具,它主要负责构建、依赖管理和项目信息管理。...在`maven_study_01`的学习笔记中,你可以找到更多关于Maven的基础知识和实践案例,帮助你快速上手并掌握这一工具。
**Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程...这份"Maven学习笔记"将是你探索Maven世界的宝贵资源,涵盖了从基本概念到高级特性的全方位知识。
五、Maven的继承与聚合 Maven支持项目间的继承和聚合。继承允许子项目共享父项目的配置,减少了重复代码。聚合则可以将多个项目组织成一个整体,方便一起构建和部署。 六、Maven profiles profiles是Maven中的环境...
** Maven学习笔记详解 ** Maven,作为Java项目管理和构建工具,是开发人员不可或缺的利器。它通过使用一种标准化的项目对象模型(Project Object Model,POM)来管理项目的依赖关系,构建过程以及配置信息。Maven...
在“培训机构传出的maven学习笔记”中,我们可能涵盖以下几个关键知识点: 1. **Maven的基本概念**:理解Maven的核心概念,如POM.xml文件、仓库(本地仓库和中央仓库)、生命周期和构建阶段(如clean、compile、...
聚合和继承是Maven中用于管理和维护大型项目的两个重要概念。聚合允许将多个模块的构建信息聚合到一个总的POM文件中,这样就可以一次性构建多个模块。继承则是为了保持项目结构的统一性,允许父POM文件定义一些公共...
**Maven项目学习笔记记录** 在软件开发领域,Maven是一个强大的项目管理和构建工具,尤其在Java开发中广泛使用。本笔记将深入探讨Maven的核心概念、主要功能以及实际应用场景,帮助你更好地理解和掌握这一重要工具...
【Maven学习笔记】 Maven是一个强大的项目管理和构建工具,主要应用于Java开发领域。它能够自动管理项目的依赖关系,帮助开发者解决因jar包版本冲突、依赖管理混乱等问题带来的困扰。Maven通过制定一套规范化的项目...
本文将深入探讨Maven的高级特性,包括多模块开发、继承与聚合,以及私有仓库(私服)的操作,这些都是在大型项目中不可或缺的知识点。 ### 一、多模块开发 在大型项目中,往往需要将代码分解为多个模块进行管理,...
书中详细解释了Maven的生命周期、插件、仓库管理以及高级特性,如聚合项目、多模块项目和自定义构建流程。通过深入阅读这本书,你可以掌握更复杂的Maven使用技巧,提升项目管理水平。 **Better_Builds_With_Maven...
**Maven学习笔记大全** Maven是一个强大的Java项目管理工具,它通过项目对象模型(Project Object Model,简称POM)来管理和构建项目。POM是一个XML文件,包含了项目的配置信息,如依赖、构建过程和插件设置。Maven...
在"maven学习笔记"中,我们可以深入学习如何配置POM.xml文件,理解Maven的生命周期和构建过程。 **Spring MVC**是Spring框架的一个模块,专门用于处理Web应用的请求-响应模型。它采用模型-视图-控制器(MVC)设计...
8. **聚合与继承**:聚合允许将多个项目组合在一起,而继承则允许共享配置,减少代码重复,提高可维护性。 9. **版本管理**:Maven遵循严格的版本命名规则,如SNAPSHOT表示开发版本,RELEASE表示稳定版本。这有助于...
- **多环境配置管理**:利用Maven的profile特性,为不同环境(如开发、测试、生产)配置不同的参数,确保构建过程的灵活性和适应性。 - **构建微服务架构**:在微服务环境中,每个服务都可以作为一个独立的Maven项目...
6. **Maven聚合与继承** - **聚合项目**:一个POM可以包含多个模块,方便管理多模块项目。 - **继承关系**:子POM可以从父POM继承配置,减少重复代码。 7. **Maven的生命周期与构建过程** - **清理**:clean生命...
Maven的聚合项目(aggregation)特性可以帮助管理这些子模块,确保构建顺序正确。 7. **Maven profiles**:profiles允许根据环境条件或特定需求来改变项目的配置。它们可以用于区分开发、测试和生产环境的配置。 8...