Maven依赖聚合与继承

x33g5p2x  于2020-09-08 发布在 Java  
字(3.1k)|赞(0)|评价(0)|浏览(687)

1、maven编写pom

1.1、pom核心元素

  • project:是所有pom.xml元素的根元素。可以声明一些命名空间以及xsd,使用这些xsd可以让第三方工具快速编辑pom
  • modeVersion:根元素的一个子元素,指定当前pom模型版本
  • groupId:定义属于哪个包
  • artifactId:当前maven文件的唯一id
  • version:当前项目的版本
  • name:非必填,指定项目名称
  • dependencies:可以包含多个dependency,声明依赖的坐标
  • dependency:添加坐标依赖
  • scope:依赖的范围

groupId、artfactId、version是定义项目的基本坐标

1.2、pom文件预览

img

2、maven依赖详解

2.1、配置依赖

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <!--其它省略,就关注下面-->
    <dependencies>
        <dependency>
            <groupId></groupId>
            <artfactId></artfactId>
            <version></version>
            <tyep>依赖类型</tyep>
            <scope>依赖范围</scope>
            <optional>可选依赖</optional>
            <exclusions>
                排除依赖
                <exclusion>
                    <groupId></groupId>
                    <artfactId></artfactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

其中

  1. type:为依赖的类型,默认为jar,对应项目坐标定义的packageing
  2. scope:依赖范围,依赖范围就是控制与三种classpath(编译、测试、运行)的关系,包含值有
    1. compile:编译范围依赖,默认为该依赖范围,对编译、测试、运行三种classpath都有效。如:log4j
    2. provided:已提供依赖范围,对编译和测试有效,运行无效。如:servlet-api
    3. runtime:运行依赖范围,对测试运行有效,编译无效。如:jdbc驱动
    4. test:测试依赖范围,对编译和测试有效,运行时无效。如:junit
    5. import:导入依赖范围,不会对三种classpath造成影响
    6. system:系统依赖范围,和provided一样,但是和系统环境有关,慎用
  3. optional:是否关闭传递依赖,false默认是传递依赖,true是屏蔽传递依赖
  4. exclusions:指定需要排除的依赖(只需要指定groupId和artfactId)

传递依赖

img

可选依赖

img

原则为:路径最近优先;第一声明优先

2.2、归类依赖

如果统一个项目中的不同模块如hadoop-common、hadoop-hdfs等等,他们的依赖版本都是相同的,就可以使用归类依赖。这样依赖版本就可以进行统一升级

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <properties>
        <scala.version>${scala.suffix.version}.8</scala.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-compiler</artifactId>
            <version>${scala.version}</version>
        </dependency>
    </dependencies>
</project>

3、maven聚合和继承

3.1、继承

为了解决多个模块(pom.xml)有很多相同的配置,可以以使用pom的继承。需要创建pom的父子结构,在父pom中声明一些配置供子pom继承,以实现"一处声明,多出使用"的目的

img

父模块中pom包含的信息

  1. 统一属性的定义
  2. 构建及插件的版本管理
  3. 发布管理设置
  4. 团队信息等

子模块使用parent元素声明父模块,parent夏子元素中groupId、artfactId和version指定父模块
坐标,必填

父模块常用元素

  1. <properties>:定义变量信息,子模块可以使用
  2. <depedencyManagement>:将项目中需要用到的构件统一在此进行管理,包括构件包、构件名及版本,
    而子模块引用即可,统一构件的版本管理,方便维护
  3. <pulginManagement>:同上用法,主要针对maven插件
  4. <distributionManagement>:发布管理,所有子模块复用

作为父模块pom的打包类型必须为pom

3.2、聚合

为了能够使用一跳命令就能够构件多个模块,可以建立额外的模块,通过该模块构件多个模块,而该模块
也有pom

img

聚合:将多个模块聚合在一起,这里需要显示定义的pom,并用modules配置多个已有模块来表示聚合
,聚合模块无需 src/main/java 目录

使用:一般情况下,为了方便用户构件项目,通常将聚合模块放在项目目录的最高层,其它模块则作为
聚合模块的子目录存在

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.liumm</groupId>
    <artifactId>Hadoop-Learning</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>Hdfs</module>
        <module>MapReduce</module>
        <module>Hbase</module>
        <module>Hive</module>
        <module>ElasticSearch</module>
    </modules>
</project>

经典模块结构

img

相关文章