这节将要描述一下聚合和继承。
首先看个问题:如果项目A和项目B是两个单独的项目组开发的,但是这两个项目又是从属于一个顶层项目。项目A和项目B都有自己的POM文件,怎样才能整合两个项目呢?
答:聚合
一、聚合
其实聚合就是从新建立一个空的Maven项目,通过POM文件来整合项目A和项目B
因为在实际应用中,我没有怎么使用过,所以这里仅仅介绍如何实现
<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>com.sinosoft</groupId> <artifactId>all</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>has a b</name> <modules> <module>A_pom</module> <module>B_pom</module> </modules> </project>
新建了一个all项目。在all项目中的POM文件大体上和上一节描述的POM文件类似。主要有两个地方不一样:
1.这个all项目的打包方式<packaging>pom</packaging>不是jar也不是war而是pom。通过在一个打包方式为pom的Maven项目中声明任意数量的module元素来实现模块聚合。
2.含有一个<modules>元素,里面含有两个<module>的子元素。<modle>来聚合任意个项目。里面的value值表示POM的路径。
聚合类型
父子项目聚合
平行项目聚合
二、继承
场景描述一:我公司开发的第四代架构采用SSH框架作为基础,在此之上加入我们自己需要的代码控制,例如校验控制,数据访问控制,数据传递控制等等。以后,我公司开发的所有项目都必须在第四代架构之上去开发。为了避免各个分公司在开发过程中使用不同的jar包依赖,造成项目不可控。所有分公司开发的新项目必须使用Maven,并且统一继承第四代架构的POM文件。这样操作后,以后开发的所有项目都会继承第四代架构的jar包,也不会造成jar包依赖错误等问题。
场景描述二:项目A要使用到:spring-core,spring-beans,spring-content,struts-core
项目B需要使用:spring-core,spring-beans,spring-content,struts-core,junit
那么在A的POM中和B的POM中共同含有spring-core,spring-beans,spring-content的依赖配置。这样就导致重复配置,出现冗余。这是程序员的大忌。在面向对象设计中,类是有父子结构的,父类声明的属性或者方法,子类可以得到继承,这样可以减少开发。类似的,POM中也可以继承。
场景描述完后,来看看怎么定义一个父POM文件。
定义父POM
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sinosoft.one</groupId> <artifactId>parent</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <name>My Parent</name> </project>
可以看到定义父POM的语法和定义聚合的语法类似,打包方式<packaging>pom</packaging>为pom。但是没有<module>。
子项目如何来继承这个父POM呢?
子POM
<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>com.sinosoft</groupId> <artifactId>MyBolg</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <parent> <groupId>com.sinosoft.one</groupId> <artifactId>parent</artifactId> <version>1.0.0</version> </parent> </project>
通过parent元素来定义继承关系。这样父POM中的所有依赖就被子类所拥有。这样就减少了子类的配置。
在parent元素中还有一个子元素:relativePath用来指定父POM的位置。如果缺省,默认值为:../pom.xml。
我们在类的继承中也有私有,保护,公共这样的访问修饰符。私有的属性或者方法,子类是无法得到。那么POM中的继承能够得到那些数据呢?
groupId:项目组ID,项目坐标的核心元素;
version:项目版本,项目坐标的核心元素;
description:项目的描述信息;
organization:项目的组织信息;
inceptionYear:项目的创始年份;
url:项目的url地址
develoers:项目的开发者信息;
contributors:项目的贡献者信息;
distributionManagerment:项目的部署信息;
issueManagement:缺陷跟踪系统信息;
ciManagement:项目的持续继承信息;
scm:项目的版本控制信息;
mailingListserv:项目的邮件列表信息;
properties:自定义的Maven属性;
dependencies:项目的依赖配置;
dependencyManagement:项目的依赖管理配置;
repositories:项目的仓库配置;
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting:包括项目的报告输出目录配置、报告插件配置等。
看起来很多,但是我们只要关注几个就够了。
1.dependencies:有了这个元素,那么子POM将拥有父POM所有的依赖。如果所有的子POM都含有相同的依赖(jar)你可以将依赖放在这个里面。但是Maven也提供了依赖管理的元素。
2.dependenciesManagement:依赖管理元素,如果父POM定义的依赖在这个元素里面,那么子类如果不声明,将不会被继承。
下面举例说明:
父POM
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sinosoft.one</groupId> <artifactId>parent</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <name>My Parent</name> <properties> <spring.version>3.1.1.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
如果子POM继承这个POM。那么子类不管有没有声明org.springframework:spring-context-support都将含有这个依赖
但是如果子类没有声明org.springframework:spring-aop,那么子类将不会依赖这个jar包。子类在使用这个依赖时,方式也不一样。只需要引用groupId:artifactId不需要带上版本号。这样子类就会使用父POM相同版本的org.springframework:spring-aop
子POM:
<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>com.sinosoft</groupId> <artifactId>MyBolg</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <parent> <groupId>com.sinosoft.one</groupId> <artifactId>parent</artifactId> <version>1.0.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> </dependencies> </project>
这样子POM就引用org.springframework:spring-context-support和org.springframework:spring-aop
使用:dependenciesManagement来管理依赖更好。如果直接使用dependencies来实现继承,那么表示子项目将不得已使用父pom中的所有依赖,有时这是没有必要的。
相关推荐
在提供的资源《一头扎进Maven3》第五讲源码及文档中,你可以找到实际的项目结构和POM配置示例,这将有助于你更深入理解Maven继承和聚合的工作原理。通过阅读和实践这些示例,你将能更好地掌握如何在实际项目中应用这...
本示例将深入探讨"Maven聚合与继承"的概念。 **一、Maven聚合(Aggregation)** Maven聚合允许我们将多个独立的Maven项目组织在一起,形成一个单一的构建单元。在我们的示例中,`parent`项目就是一个聚合项目。它...
本示例将深入探讨Maven中的“依赖”、“继承”和“聚合”这三个核心概念,帮助开发者更好地理解和应用Maven。 首先,我们来讨论"Maven依赖"。在Java开发中,一个项目往往需要引用其他库或者框架来完成特定功能。...
POM包含了项目的基本信息、构建指令、依赖关系和插件配置等,是Maven工作的核心。 2. **Maven仓库** Maven利用中央仓库来管理各种项目的依赖,包括JAR包、源码、文档等。开发者只需在POM中声明依赖,Maven会自动...
9. **聚合与继承**:聚合项目允许将多个独立的Maven项目组合在一起,而继承则允许共享POM中的部分配置,减少了重复代码。 10. **持续集成**:Maven与许多持续集成工具(如Jenkins、Travis CI等)集成良好,使得自动...
### Maven的聚合与继承 - **聚合(Aggregation)**:一个POM可以包含多个子项目,形成一个聚合项目,方便整体管理和构建。 - **继承(Inheritance)**:子项目可以继承父项目的配置,减少重复代码,保持配置一致性...
3. **继承与聚合**:Maven 提供了父POM和多模块项目的支持,通过继承,多个子项目可以共享相同的配置。聚合功能允许用户在一个父项目中管理多个子项目,方便整体构建。 4. **版本管理**:Maven 可以处理不同版本的...
Maven的聚合与继承** - **聚合(Aggregation)**: 一个项目可以聚合多个子项目,便于统一构建和管理。 - **继承(Inheritance)**: 子项目可以继承父项目的POM,共享配置,减少重复。 **6. Maven的 Profiles** ...
6. Maven聚合项目(Aggregation)与继承(Inheritance): - **聚合项目**:将多个子项目组织在一起,方便进行统一构建。 - **继承**:子项目继承父项目的POM,共享配置和依赖。 7. Maven的多模块项目: - 多...
### Maven安装配置教程及仓库、POM坐标系、Maven工程、继承与聚合 #### Maven安装与配置 在开始之前,我们首先需要了解Maven是什么。Maven是Apache的一个项目,是一个项目管理和综合工具,主要用来帮助Java项目...
6. **Maven聚合与继承** - **聚合项目**:一个POM可以包含多个模块,方便管理多模块项目。 - **继承关系**:子POM可以从父POM继承配置,减少重复代码。 7. **Maven的生命周期与构建过程** - **清理**:clean生命...
本文将深入探讨Maven的聚合与继承特性,并通过实例进行详细解释。 首先,Maven的依赖管理系统允许开发者声明项目所需的库和它们的版本,从而避免了版本冲突和手动管理jar包的问题。在Maven的POM(Project Object ...
Maven的核心概念包括项目对象模型(Project Object Model,POM)、依赖管理和生命周期。在Maven中,"聚合"和"继承"是两个重要的特性,它们有助于管理和组织大型的多模块项目。 **一、Maven聚合** Maven聚合...
Maven是一个非常强大的Java项目管理和理解工具,其核心在于`pom.xml`文件。通过这个文件,Maven能够自动化地管理项目的构建流程,包括依赖管理、编译、测试、打包、部署等。 - **分布式部署**:Maven支持将项目分布...
在"Maven 依赖,聚合,继承,插件运行应用"这个主题中,我们将深入探讨这四个核心概念。 1. **依赖管理**:Maven依赖是项目中各个模块之间共享代码的关键机制。当你在POM.xml文件中声明一个依赖,Maven会自动下载并...
本文将深入探讨Maven的核心技术,包括坐标的定义、仓库管理、生命周期与插件以及聚合与继承,帮助读者全面理解并掌握Maven的工作原理。 一、坐标与依赖 1. 坐标 Maven项目的坐标是通过POM(Project Object Model...
**二、聚合与继承** 聚合和继承是Maven中两个重要的概念。在本项目中,聚合关注的是项目间的组织关系,而继承则关注的是共享配置。 1. **聚合**:在`<modules>`标签下,聚合POM列出所有子项目的相对路径,使得...
在使用Maven构建Web项目时,`...在实际开发中,`pom.xml`文件可能更复杂,包含了更多的插件配置、属性、继承、聚合等高级特性,以适应不同项目的需求。理解并熟练掌握这些配置对于任何Java Web开发者都是至关重要的。