首页 > 其他 > 详细

笔记:Maven 聚合和继承

时间:2017-02-19 18:07:37      阅读:248      评论:0      收藏:0      [点我收藏+]
  1. 聚合模块

    我们希望一次构建两个或更多项目,而不是到每个模块的目录下分别执行mvn命令,Maven 聚合这一特性就是为该需求服务的, 为了使用聚合,我们必须创建一个聚合模块,通过该模块与其他项目聚合,并且该模块可以为其他模块的父目录,也可以是平级目录,首先目录结构如下:

  • account-aggregator(聚合模块目录)
    • pom.xml
    • account-email(email模块)
      • src
      • pom.xml
    • account-service(service模块)
      • src
      • pom.xml

account-aggregator 模块的 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/xsd/maven-4.0.0.xsd">

????<modelVersion>4.0.0</modelVersion>

? ?

????<groupId>org.drsoft.account</groupId>

????<artifactId>account-aggregator</artifactId>

????<version>1.0-SNAPSHOT</version>

????<!-- 聚合和父POM模块必须为 pom -->

????<packaging>pom</packaging>

???? ?

????<!-- 配置需要聚合的模块的相对目录 -->

????<modules>

????????<module>account-email</module>

????????<module>account-service</module>

????</modules>

</project>

? ?

此时,在account-aggregator目录下执行 Maven 命令,就会同时构建在 modules 中的模块,示例命令:

mvn clean

命令结果:

技术分享

  1. 继承模块

    面向对象设计中,程序员可以建立一种类的父子结构,然后在父类中声明一些字段和方法供子类继承,这样就可以做到一处声明多处使用,类似的,我们也可以创建POM的父子结构,在父POM中声明一些配置供子POM继承,我们继续以聚合中的模块来说明,其account-aggregator模块POM不变,我们看子POM的account-service配置示例:

    <?xml version="1.0"?>

    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

    ????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    ????<modelVersion>4.0.0</modelVersion>

    ????<!-- groupId 和 version 一致,因此从父 POM 继承 -->

    ????<artifactId>account-service</artifactId>

    ????<name>account-service</name>

    ????<url>http://maven.apache.org</url>

    ????<!-- 父POM配置 -->

    ????<parent>

    ????????<!-- 父POM的项目组 -->

    ????????<groupId>org.drsoft.account</groupId>

    ????????<!-- 父POM的项目唯一标识 -->

    ????????<artifactId>account-aggregator</artifactId>

    ????????<!-- 父POM的版本 -->

    ????????<version>1.0-SNAPSHOT</version>

    ????????<!-- 父POM的文件相对路径,默认值:../pom.xml

    (可选,如果设置了将首先根据该属性找父POM,找不到则从本地仓库查找)

    -->

    ????????<relativePath>../pom.xml</relativePath>

    ????</parent>

    </project>

  • 可继承的POM元素
    • groupId:项目组ID,项目坐标的核心元素
    • version:项目版本,项目坐标的核心元素
    • description:项目的描述信息
    • organization:项目的组织信息
    • inceptionYear:项目的创始年份
    • url:项目的URL地址
    • developers:项目的开发者信息
    • contributors:项目的贡献者信息
    • distributionManagement:项目的部署配置
    • issueManagement:项目的缺陷跟踪系统信息
    • ciManagement:项目的持续集成系统信息
    • scm:项目的版本控制系统信息
    • mailingLists:项目的邮件列表信息
    • properties:自定义的Maven属性
    • dependencies:项目的依赖配置
    • dependencyManagement:项目的依赖管理配置
    • repositories:项目的仓库配置
    • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
    • reporting:包括项目的报告输出目录配置、报告插件配置等
  • 依赖管理

    我们可以看到 dependencies元素是可以被继承的,因此在父POM中声明的依赖都会被继承到子POM中,但还存在一个问题,我们无法确认将来添加的子模块一定需要目前所有的依赖项,可能只是简单的 util 工具模块,Maven 还提供了 dependencyManagement 元素既能让子元素模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性,在 dependencyManagement 元素下的依赖声明不会不会引入实际的依赖,不过他能约束dependencies下的依赖使用,配置示例如下:

    • account-aggregator 模块的 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/xsd/maven-4.0.0.xsd">

      ????<modelVersion>4.0.0</modelVersion>

      ????<groupId>org.drsoft.account</groupId>

      ????<artifactId>account-aggregator</artifactId>

      ????<version>1.0-SNAPSHOT</version>

      ????<packaging>pom</packaging>

      ????<name>account-aggregator</name>

      ????<url>http://maven.apache.org</url>

      ????<!-- 聚合模块 -->

      ????<modules>

      ????????<module>account-email</module>

      ????????<module>account-service</module>

      ????</modules>

      ????<!-- 实际依赖 -->

      ????<dependencies>

      ????????<dependency>

      ????????????<groupId>junit</groupId>

      ????????????<artifactId>junit</artifactId>

      ????????????<version>3.8.1</version>

      ????????????<scope>test</scope>

      ????????</dependency>

      ????</dependencies>

      ????<!-- 声明依赖,但不会实际依赖 -->

      ????<dependencyManagement>

      ????????<dependencies>

      ????????????<dependency>

      ????????????????<groupId>org.springframework</groupId>

      ????????????????<artifactId>spring-context</artifactId>

      ????????????????<version>4.3.6.RELEASE</version>

      ????????????</dependency>

      ????????</dependencies>

      ????</dependencyManagement>

      </project>

      查询 account-aggregate 依赖,命令如下:

      mvn dependency:tree

      命令结果:

      技术分享

      根据依赖显示结果,发现其依赖关系中只有 junit,没有 org.springframework

    • account-service子POM的配置示例:

      <?xml version="1.0"?>

      <project

      ????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

      ????xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

      ????<modelVersion>4.0.0</modelVersion>

      ????<artifactId>account-email</artifactId>

      ????<name>account-email</name>

      ????<url>http://maven.apache.org</url>

      ????<!-- 父POM配置 -->

      ????<parent>

      ????????<!-- 父POM的项目组 -->

      ????????<groupId>org.drsoft.account</groupId>

      ????????<!-- 父POM的项目唯一标识 -->

      ????????<artifactId>account-aggregator</artifactId>

      ????????<!-- 父POM的版本 -->

      ????????<version>1.0-SNAPSHOT</version>

      ????????<!-- 父POM的文件相对路径 -->

      ????????<relativePath>../pom.xml</relativePath>

      ????</parent>

      ????<!-- 依赖配置,依赖信息从父POM 的 dependencyManagement 内的依赖,

      ???????? 因此只需要 groupId 和 artifactId -->

      ????<dependencies>

      ????????<dependency>

      ????????????<groupId>org.springframework</groupId>

      ????????????<artifactId>spring-context</artifactId>

      ????????</dependency>

      ????</dependencies>

      </project>

      查询account-email的依赖,命令如下:

      mvn dependency:tree

      命令结果:

      技术分享

      可以看到继承到了父POM的 junit依赖,和设置的 org.springframework 依赖

  1. 插件管理

    Maven 提供了 pluginManagement 元素帮助管理插件,该元素中配置的依赖不会造成实际的插件调用行为,但POM中配置了真正的plugins元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,才会影响实际的插件行为。

  • account-aggregate 的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/xsd/maven-4.0.0.xsd">

    ????<modelVersion>4.0.0</modelVersion>

    ????<groupId>org.drsoft.account</groupId>

    ????<artifactId>account-aggregator</artifactId>

    ????<version>1.0-SNAPSHOT</version>

    ????<packaging>pom</packaging>

    ????<name>account-aggregator</name>

    ????<url>http://maven.apache.org</url>

    ????<!-- 聚合模块 -->

    ????<modules>

    ????????<module>account-email</module>

    ????????<module>account-service</module>

    ????</modules>

    ????<build>

    ????????<!-- 插件管理-->

    ????????<pluginManagement>

    ????????????<plugins>

    ????????????????<plugin>

    ????????????????????<groupId>org.apache.maven.plugins</groupId>

    ????????????????????<artifactId>maven-source-plugin</artifactId>

    ????????????????????<version>3.0.1</version>

    ????????????????????<executions>

    ????????????????????????<execution>

    ????????????????????????????<phase>verify</phase>

    ????????????????????????????<goals>

    ????????????????????????????????<goal>jar-no-fork</goal>

    ????????????????????????????</goals>

    ????????????????????????</execution>

    ????????????????????</executions>

    ????????????????</plugin>

    ????????????</plugins>

    ????????</pluginManagement>

    ????</build>

    </project>

  • account-service子POM配置:

    <?xml version="1.0"?>

    <project

    ????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

    ????xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    ????<modelVersion>4.0.0</modelVersion>

    ????<artifactId>account-service</artifactId>

    ????<name>account-service</name>

    ????<url>http://maven.apache.org</url>

    ????<!-- 父POM配置 -->

    ????<parent>

    ????????<!-- 父POM的项目组 -->

    ????????<groupId>org.drsoft.account</groupId>

    ????????<!-- 父POM的项目唯一标识 -->

    ????????<artifactId>account-aggregator</artifactId>

    ????????<!-- 父POM的版本 -->

    ????????<version>1.0-SNAPSHOT</version>

    ????????<!-- 父POM的文件相对路径 -->

    ????????<relativePath>../pom.xml</relativePath>

    ????</parent>

    ????<build>

    ????????<!-- 子POM定义使用插件,只需要 groupId 和 artifactId

    ???????????? 其他由父POM的 pluginManagement 一定 -->

    ????????<plugins>

    ????????????<plugin>

    ????????????????<groupId>org.apache.maven.plugins</groupId>

    ????????????????<artifactId>maven-source-plugin</artifactId>

    ????????????</plugin>

    ????????</plugins>

    ????</build>

    </project>

? ?

笔记:Maven 聚合和继承

原文:http://www.cnblogs.com/li3807/p/6416223.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!