`
zc985552943
  • 浏览: 287349 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Babe4ca6-5e6f-33aa-9078-762ee3ccfb7e
云计算--hadoop
浏览量:11490
5e98c2c1-2a82-3388-bc80-7fca0170bb12
redis解说
浏览量:26649
088014c7-4d3f-39ce-b72e-4ebe7046a134
MongoDB读书笔记
浏览量:15634
D2b74847-c860-3e26-96fe-3fa4498d6348
Maven读书笔记
浏览量:26690
688db20f-402d-3a1d-8188-d6153d6c7465
Java通信
浏览量:13399
社区版块
存档分类
最新评论

04_Maven核心_POM_聚合与继承

阅读更多

这节将要描述一下聚合和继承。

首先看个问题:如果项目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中的所有依赖,有时这是没有必要的。

 

 

分享到:
评论
2 楼 feng_zhi_zi510 2016-11-15  
博主你好。我这有点问题始终没搞明白。关于继承的
在父模块定义了依赖,并且类似
<dependency>
<groupId>com.comtop.sproc.dependency</groupId>
<artifactId>dependency-top-platform</artifactId>
<version>${sproc.release.version}</version>
<type>pom</type>
</dependency>
子模块选择性继承了该依赖
<dependency>
<groupId>com.comtop.sproc.dependency</groupId>
<artifactId>dependency-top-platform</artifactId>
<type>pom</type>
</dependency>
现在出现一个情况,在父模块执行mvn compile和mvn compile -pl sproc-common -am,编译能通过;但在父模块执行mvn compile -pl sproc-common和在子模块执行mvn compile都会报错。报错信息:[ERROR] Failed to execute goal on project sproc-common: Could not resolve dependencies for project com.comtop.sproc:sproc-common:jar:1.3.8-SNAPSHOT: Failed to collect dependencies at com.comtop.sproc.dependency:dependency-top-platform:pom:1.3.8-SNAPSHOT: Failed to read artifact descriptor for com.comtop.sproc.dependency:dependency-top-platform:pom:1.3.8-SNAPSHOT: Could not find artifact com.comtop.sproc.dependency:sproc-dependency:pom:1.3.8-SNAPSHOT in central (http://10.10.15.61:8081/nexus/content/groups/public/) -> [Help 1]。搞不明白为什么会出现这情况
1 楼 cheleiyan 2016-07-03  
如何创建空的mave项目,用eclipse建的时候,选择哪个类型?

相关推荐

    maven聚合与继承配置

    一个简单的maven聚合,继承示例。parent为父目录,account-email,account-persist为子项目,继承了parent的pom.xml文件

    尚硅谷Java视频教程_Maven视频

    生产环境下开发对Maven的需求 · 04.运行时环境 · 05.一只煮熟的鸡 · 06.自动化构建和构建环节 · 07.部署Maven核心程序 · 08.约定的目录结构说明 · 09.第一个Maven工程的目录结构和文件内容 · 10.联网...

    Maven初识,核心概念,构建多模块系统

    认识Maven。Maven安装,Maven核心概念,约定配置,坐标和仓库,POM,依赖管理,构建的总结,聚合与继承的区别。的脑图

    maven 关于 scope test 和 继承传递的问题

    NULL 博文链接:https://dannyhz.iteye.com/blog/2249427

    maven window下安装包

    第8章:聚合和继承/8.3 继承/8.3.2 可继承的POM元素 第8章:聚合和继承/8.3 继承/8.3.3 依赖管理 第8章:聚合和继承/8.3 继承/8.3.4 插件管理 第8章:聚合和继承/8.4 聚合与继承的关系 第8章:聚合和继承/8.5 约定...

    Maven实战(高清版)

    背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...

    maven多模块聚合的springboot+duubo+zokeeper+Redis整合demo

    maven管理的多模块聚合的springboot+duubo+zokeeper+Redis整合demo,一个父pom文件,分为api/service/client多个子module

    Maven学习精华教程-电子书

    此文件为exe格式电子书,无需安装任何阅读软件就可以打开,由mybase笔记软件生成。 此电子书详细介绍了项目自动化构建工具Maven的...聚合与继承 插件_概念与使用 插件_常用插件列表 仓库_概念与配置 仓库_私服_Nexus

    maven多模块项目(简单实例)

    所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块,multi-module)相互关联。 提供了一个简单的Maven多模块实例

    Maven的安装及整合

    目前无论使用IDEA还是Eclipse等其他IDE,使用里面ANT工具。ANT工具帮助我们进行编译,打包运行等工作。...关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。

    Maven实战

    Maven实战,讲述了如何下载安装Maven,Maven的生命周期,POM文件,继承,聚合,Maven仓库,Maven插件,maven常用命令,项目依赖和依赖传递,使用Maven创建各种项目。

    SSM项目pom文件通用

    通过POM文件,Maven可以自动管理项目的依赖关系、构建过程和部署过程等,大大简化了项目的管理和维护。同时,POM文件也是Maven多模块项目的重要组成部分,可以通过继承和聚合等方式来管理多个子模块的信息。

    IDEA开发工具+Maven使用详解视频课程(适合初学者的教程)

    本课程从IDEA开发工具的安装及配置使用讲起,详细讲解Maven项目管理工具,适合初学者的教程,让你少走...继承、聚合、依赖5.使用Nexus搭建私服6.Maven综合实战应用教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    bacala:scala 包依赖管理器

    项目目标该项目的目标是: 使用 SAT 求解器作为核心算法提供定义良好的 API 和命令行接口跑步要解析 POM 文件: ./maven data/pom/github-api.xml解析 Ivy 文件 ./ivy data/ivy/parseq.xml测试sbt test 待办事项清单...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    除了项目构建,Maven最核心的功能是软件包的依赖管理,能够自动分析项目所需要的依赖软件包,并到Maven中心仓库去下载。 A)管理依赖的jar包 B)管理工程之间的依赖关系。 3.2. Maven本地仓库 在当前系统用户的...

    Taotao:基于soa架构的分布式电子商城

    系统架构项目搭建开发环境分析开发环境: MyEclipse + Tomcat7 + MySQL + SVN软件架构: springMVC + Mybatis + Maven + CentOS+ Solr + Redis + Nginx后台工程搭建分析Maven的常见打包方式:jar、war、pomPom工程...

    java版商城源码下载-onlineshop:电子商城练习demo

    公司级别的父工程,所有工程必须继承这个(pom包),在其pom.xml文件中,定义了所有用到的jar包所有版本信息 onlineshop-common 通用工程,每一个工程中有很多工具类,文件或图片以及上传下载的处理,json转java对象,...

    e3mall:javaweb企业级项目开发

    *父工程*聚合工程*模块*工程的继承,依赖。 6.ssm框架整合。 7.svn的使用第二天: 1.dubbo,服务治理工具。实现系统之间的通信。 1.)服务提供者2.)服务消费者3.)注册中心,使用zookeeper实现,相当于房产中介。 ...

Global site tag (gtag.js) - Google Analytics