一个序列生命周期(Project Lifecycle),而插件从 maven仓库获得.

Maven初入

maven 是一个品种管理工具, 它包含了一个 项目对象模型(Project Object Model
POM), 一组正式集合, 一个种类生命周期(Project Lifecycle),
一个借助管理种类(Dependency Management System), 和用来运转 定义在
生命周期阶段中插件目的的逻辑.

Maven的基本只做一些基础的事务, 解析XML文档, 管理生命周期, 插件,
仅此而已; Maven的主要职分是委任给种种各类的插件, 如编译源码,
打包二进制代码, 揭橥站点 和 其余创设职责, 而插件从 maven仓库得到.

文档参考自: Maven权威指南

Maven初入

maven 是一个项目管理工具, 它涵盖了一个 项目对象模型(Project Object Model
POM), 一组正式集合, 一个档次生命周期(Project Lifecycle),
一个依靠管理种类(Dependency Management System), 和用来运行 定义在
生命周期阶段中插件目标的逻辑.

Maven的主导只做一些基础的事体, 解析XML文档, 管理生命周期, 插件,
仅此而已; Maven的首要义务是委任给种种各种的插件, 如编译源码,
打包二进制代码, 公布站点 和 其余构建职务, 而插件从 maven仓库获得.

文档参考自: Maven权威指南

Maven初步

设置自不必赘述, Maven的连锁计划在 ~/.m2/settings.xml,

~/.m2/repository 是本土仓库目录.

Maven初步

安装自不必赘述, Maven的连带配置在 ~/.m2/settings.xml,

~/.m2/repository 是本土仓库目录.

maven要旨概念

  1. 插件和对象

    就好像在前边所提到过的, Maven的主导所做的劳作很少,
    半数以上做事都会叫给插件来做, 一个插件 是一个或多少个对象的会聚,
    插件的直观表现就是一个或多个jar包, 目的指的就是 某一个切实的法门,
    可以安排相应的参数, 同时需求给定一些务必参数;

    简写: pluginId:goalId

  2. 生命周期(Lifecycle)

    生命周期是带有在一个项目中一名目繁多有序的级差,
    在maven中配有默许的生命周期, 以表达项目标骨干完整性先导,
    以把项目揭穿成产品为止.

    个中, 插件目的是足以依附在生命周期上的, 会随着生命周期的等级
    一步步执行, 当 maven执行一个品级的时候,
    他先是会平稳实施前面的有所阶段, 并执行绑定在等级上的默认目的,
    到命令指定的不行阶段甘休;

    recourses: recourses; Recourses插件的 recourses目的绑定在了
    recourses阶段, 这么些目的复制 src/main/recourses 下的具有资源 和
    其余任何配置的资源目录, 到输出目录;

    compiler: compile 绑定到了 compile阶段,编译 src/main/java
    下的有所源代码 和 其余任何配置的资源目录, 到输出目录.

    recourses: testRecourses Resources插件的 testRecourses目标绑定到了
    test-recourses阶段, 对应 src/test/resources

    compiler: testCompile 对应 src/test/java

    surefire: test surefire插件的对象test 绑定到 test阶段,
    那些目的运行具有的测试, 并成立那一个 捕捉 详细测试结果的文书,
    默许意况下, 如果有测试战败, 那一个目的会停下

    jar:jar 绑定到 package阶段, 把出口目录打包成 jar文件.

  3. Maven 坐标

    POM为品种命名, 提供了类其他一组唯一标识符(坐标), 并通过
    正视(dependencies), 父(parents) 和 先决条件(prerequisite)
    来定义和此外种类的关系.

    Maven定义了一组坐标, 他们得以用来标识一个类型, 一个依靠,
    或许MavenPom里一个插件.

    GroupId: 团体, 集团, 协会等别的, 就是java中的 com.company.project

    artifactId: 项目的识

    version: 版本号, 一般会由此抬高 “SNAPSHOT”标记, 标识正在开发中.

    packing(非必须): 默许为 jar, 项目打包后输出, war 表示web 项目.

    同时要求小心的是: 在 artifactId中最好永不使用 “.”

  4. Maven仓库

    路线为, 绝对于仓库根目录:

    /<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packing>

  5. Maven依赖

    对此依靠, 目前只必要了然倚重具有传递性,即可.

maven宗旨概念

  1. 插件和对象

    如同在头里所关联过的, Maven的着力所做的做事很少,
    半数以上办事都会叫给插件来做, 一个插件 是一个或多少个目的的见面,
    插件的直观表现就是一个或三个jar包, 目的指的就是 某一个切实可行的主意,
    可以安插相应的参数, 同时必要给定一些无法不参数;

    简写: pluginId:goalId

  2. 生命周期(Lifecycle)

    生命周期是包蕴在一个门类中一多元有序的级差,
    在maven中配有默许的生命周期, 以验证项目标主干完整性伊始,
    以把品种揭破成成品甘休.

    其间, 插件目的是可以依附在生命周期上的, 会随着生命周期的等级
    一步步执行, 当 maven执行一个等级的时候,
    他第一会逐步实施前面的装有阶段, 并执行绑定在等级上的默许目的,
    到命令指定的万分阶段甘休;

    recourses: recourses; Recourses插件的 recourses目的绑定在了
    recourses阶段, 这些目的复制 src/main/recourses 下的富有资源 和
    其余任何配置的资源目录, 到输出目录;

    compiler: compile 绑定到了 compile阶段,编译 src/main/java
    下的兼具源代码 和 其余任何配置的资源目录, 到输出目录.

    recourses: testRecourses Resources插件的 testRecourses目的绑定到了
    test-recourses阶段, 对应 src/test/resources

    compiler: testCompile 对应 src/test/java

    surefire: test surefire插件的对象test 绑定到 test阶段,
    那个目的运行具有的测试, 并创设那一个 捕捉 详细测试结果的文件,
    默许景况下, 假诺有测试失利, 这一个目标会停下

    jar:jar 绑定到 package阶段, 把出口目录打包成 jar文件.

  3. Maven 坐标

    POM为项目命名, 提供了花色的一组唯一标识符(坐标), 并通过
    倚重(dependencies), 父(parents) 和 先决条件(prerequisite)
    来定义和其余类型的关系.

    Maven定义了一组坐标, 他们得以用来标识一个类型, 一个凭借,
    大概MavenPom里一个插件.

    GroupId: 团体, 集团, 社团等任何, 就是java中的 com.company.project

    artifactId: 项目标识

    version: 版本号, 一般会因而抬高 “SNAPSHOT”标记, 标识正在开发中.

    packing(非必须): 默许为 jar, 项目打包后输出, war 代表web 项目.

    同时必要小心的是: 在 artifactId中最好永不使用 “.”

  4. Maven仓库

    途径为, 相对于仓库根目录:

    /<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packing>

  5. Maven依赖

    对此依靠, 近年来只必要了然器重具有传递性,即可.

Maven注意事项

  1. 优化, 下降依赖重复

    1. 进化共同的正视至 dependencyManagement

      只要多于一个种类倚重于一个特定的倚重, 就可以在
      dependencyManagement中列出那么些依靠,
      父POM包括一个本子和一组排除配置, 在子POM中必要拔取groupId和artifactId引用这些依靠, 即使倚重已经在
      dependencyManagement中列出, 子项目得以额忽略版本和搞定配置;

      <properties>
          <hibernate.annotation.version>3.3.0</hibernate.annotation.version>
      </properties>
      

      经过那种艺术将版本音信定义为 常量, 通过 ${ }引用变量

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-annotation</artifactId>
          <version>${hibernate.hibernate.annotation.version}</version>
      </dependency>
      
    2. 为兄弟项目应用内置的 version 和 groupId

    3. 动用相同的 groupId 和 ${project.version}.

    4. 升高共同的 plugin 至 pluginManagement

    5. 来得的扬言正视, 不要通过敬重传递性来引用 jar包

    6. 运用 Maven Denpendency插件优化:

      透过 mvn dependency:analyze 对品种展开解析,
      但增删器重判断的先决条件是单元测试;

      在 analyze中, 生命周期依次为:
      recourses, compile, testRecourses, testCompile, analyze;

      会将履行中的错误, 未注解的 jar, 声明未使用的jar 各样突显出来.

      而采用 mvn dependency:tree , 会列出项目中存有的直接和传递性看重.

    7. 多少个帮扶插件

      mvn help:active-profiles 列出当下营造中移动的 Profile

      mvn help:effective-pom 彰显当前打造的其实 pom

      mvn help:effective-settings 打印实际的setting,
      包罗全局和用户级其他

      mvn help:describe 描述插件的属性, 无需在类型目录下运作,
      但必须提供插件的 groupId 和 artifactId

      如: mvn help:describe -Dplugin=complier [Dmojo=compile]
      [-Dfull]

      第三个参数表示插件中的某一个目标, 第多个参数为目的的富有新闻,
      同时在:

      “-D<name>=<value>” 这种艺术设定 调用 mvn 插件目的,传入目的中的参数中的 值. 需求专注的是, 那并非是 Maven的语法,
      其实是 java 用来设置系统品质的方式.

Maven注意事项

  1. 优化, 下落看重重复

    1. 迈入共同的依赖至 dependencyManagement

      一旦多于一个品类依赖于一个一定的看重, 就可以在
      dependencyManagement中列出这几个依靠,
      父POM包涵一个本子和一组排除配置, 在子POM中必要选择groupId和artifactId引用这几个依靠, 如果器重已经在
      dependencyManagement中列出, 子项目可以额忽略版本和扫除配置;

      <properties>
          <hibernate.annotation.version>3.3.0</hibernate.annotation.version>
      </properties>
      

      因此那种方式将版本新闻定义为 常量, 通过 ${ }引用变量

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-annotation</artifactId>
          <version>${hibernate.hibernate.annotation.version}</version>
      </dependency>
      
    2. 为小兄弟项目采取内置的 version 和 groupId

    3. 使用相同的 groupId 和 ${project.version}.

    4. 发展共同的 plugin 至 pluginManagement

    5. 来得的扬言倚重, 不要通过倚重传递性来引用 jar包

    6. 动用 Maven Denpendency插件优化:

      通过 mvn dependency:analyze 对品种进展辨析,
      但增删正视判断的先决条件是单元测试;

      在 analyze中, 生命周期依次为:
      recourses, compile, testRecourses, testCompile, analyze;

      会将执行中的错误, 未表明的 jar, 表明未使用的jar 各样突显出来.

      而利用 mvn dependency:tree , 会列出项目中有所的第一手和传递性倚重.

    7. 多少个帮扶插件

      mvn help:active-profiles 列出方今创设中移动的 Profile

      mvn help:effective-pom 显示当前营造的其实 pom

      mvn help:effective-settings 打印实际的setting,
      包含全局和用户级其余

      mvn help:describe 描述插件的品质, 无需在品种目录下运行,
      但必须提供插件的 groupId 和 artifactId

      如: mvn help:describe -Dplugin=complier [Dmojo=compile]
      [-Dfull]

      其次个参数表示插件中的某一个对象, 第多少个参数为目的的兼具新闻,
      同时在:

      “-D<name>=<value>” 那种格局设定 调用 mvn 插件目标,传入目的中的参数中的 值. 需求小心的是, 那决不是 Maven的语法,
      其实是 java 用来设置系统本性的格局.

Maven Pom

抱有的 Maven POM 都继承自顶级POM, 一流POM所处目录为: {Maven
HOME}/lib/maven-model-builder-{Maven Version}.jar 内
org.apache.maven.model 下的 POM-4.0.0.xml.

文本重大定义了:

  1. 独立的长距离仓库, https://repo.maven.apache.org/maven2

    <repositories>
    <repository>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
    <layout>default</layout>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    </repository>
    </repositories>
    
  2. 为主导插件提供了默许的本子

大家温馨建立的 POM最顶层继承自 一级 POM, 其次是具有的 父级POM, 自上向下
会一层层 覆盖从前的默认配置, 通过 mvn help:effective
可以查阅当前项目的立见成效pom.

上边就从头一步步看POM.xml文件中的配置:

  1. version

    <major version>.<minor version>.<incremental version>-<qualifier>
    
    1.3.5-beta-01
    

    里头1为主版本号, 3为次版本号, 5为增量版本号,
    beta-01为限量版本号(alpha 和 beta). 即便版本号符合规则须求,
    则根据版本号来相比, 否则根据字符串规则来拓展相比较. 比如 a10 是 排在
    a2面前的, 由此 a10属于旧版本, 但在我们的定义中, 却相应是倒转的.

    本子界限配置格局:

    (loVersion, hiVersion) 不包含
    [loVersion, hiVersion] 包含

    <version>[3.8, 4.1.2]</version>
    

    当不指定上界/下界时, 则为上述/以下

    SNAPSHOT

    即使您在本子中行使了 字符串 SNAPSHOT, 表示项目正处在 活动的
    开发情况, Maven会在安装 或计划的时候将 符号展开为
    一个时刻和日期,转换为 UTC.(也就是快照版本)

    如在开创的时候, 默许为 0.1-SNAPSHOT, 而后将品种配置到了 Maven仓库,
    Maven会将版本进行为 0.1-YYYYMMDD-HH24MISS-1, 那里的大运 为UTC时间.

    如若项目倚重的一个零部件正处在开发进程中, 倚重它的 SNAPSHOT版本,
    则在运转打造的时候, 会自动从仓库下载最新的 SNAPSHOT, 同时, 要倚重SNAPSHOT版本, 用户必须在 POM中利用 repository 和 pluginRepository
    开启下载 SNAPSHOT作用.

    <!--选择对应的 坐标, 将 enabled 属性设置为 true 即可-->
    <repositories>
        <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        </repository>
    </repositories>
    
    <pluginRepositories>
        <pluginRepository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        </pluginRepository>
    </pluginRepositories>
    

    而发表到 非 snapshot的 Maven仓库的打造无法凭借于 SNAPSHOT版本,
    仅用于开发进程.

    LATEST 和 RELEASE

    当倚重于一个插件 或 依赖, 可以利用异乎常常值:

    LATEST: 最新发表的版本 或 快照版.

    RELEASE: 仓库中 最后一个非快照版本.

    在项目揭露的时候, 尽量不要选用 那多个基本点字, 仅在支付时使用

  2. 变量引用

    在Maven中有八个放置隐士变量:

    env: 表示 environment, 系统的环境变量, 如 ${env.PATH},
    必要注意的是急需大写, 如 ${env.JAVA_HOME}

    settings: 这些指的是 settings.xml中的属性, 但平素引用不成功.

    project: 引用当前 project中的属性 如 ${project.artifactId}.

    ${basedir}, 可以访问当前项目根目录

    Java系统性情

    大凡足以被 java.lang.System 中的 getProperties()方法访问的天性

    可以在Java中经过 System.getProperties().list(System.out);
    在Maven中经过 ${} 直接访问, 如 ${java.runtime.name}

    自定义属性:

    <properties>
        <attribute>value</attribute>
    </properties>
    

    做客方式即: ${attribute.value}

  3. 依靠范围

    <version>1.0</version>
    <scope>test</scope>
    

    compile: 编译范围, 默许范围, 在富有的classpath都得以运用, 也会被打包

    provided: 已提供范围, 唯有当 JDK/容器已经提供该正视之后才使用, 如在
    开发中 必要 Servlet API编译一个 Servlet,
    但在卷入公布之后那部分应该由 容器/服务器本身来提供. 仅在编译时可用.
    不可传递, 不会打包.

    runtime: 运行时界定, 在编译时不须求, 在运转时须求.

    test: 测试范围, 仅在测试时索要, 测试运行, 测试编译.

    system: 系统范围, 必须提供 systemPath, 即本地jar文件的路径.

    可选重视:

    <version>1.0</version>
    <optional>true</optional>
    

    通过那种方法生命的依靠, 不会被传递. 需求在子项目中再一次生命

  4. 依傍的传递

    test范围不会被传送, provided范围 仅在 provided中被传送, runtime 和
    compile 在 多种限制都会被传递.

    e.g. : A 包罗对 B的测试范围重视, B 包蕴对 C的编译时倚重, 则
    C为A的测试范围倚重

    A:
    <dependency>
        <groupId>B</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
    B:
    <dependency>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0</version>
    </dependency>
    

    e.g. : A包罗对 B的测试范围倚重, B包涵对C的测试范围看重, 则 A与C无关.

    A:
    <dependency>
        <groupId>B</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
    B:
    <dependency>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
    

    凭借追踪:

    在 Maven中, 若是多少个系列倚重于同一个 project, 则Maven会找到
    所有倚重中版本最新的 依赖, 作为最终的选项, 所以可以去掉对应的倚重性,
    且同时 可以 更换本身想要的版本.

    e.g.:

    <dependency>
        <groupId>B</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <exclusions>
            <exclusion>
                <groupId>C</groupId>
                <artifactId>C</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  5. 依傍管理

    那在头里 优化 已经提到, 选取在父级项目中定义 dependencyManagement,
    pluginManagement, 在子级中沿用父级的本子, 仅须求列出所拔取的
    倚重坐标, 而无需再一次定义版本(假使定义子级版本, 父级就会被忽略);

    多模块项目:

    <modules>
        <module>project-a</module>
        <module>project-b</module>
    </modules>
    

    多模块项目标打包总是一个 POM 而非营造, 其中种种模块可以为 POM 恐怕jar

    品种持续:

    <parent>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    

    可以被一而再的连串:

    • 定义符: groupId 和 artifactId 必须有一个被重写,
      不可以有完全相同的坐标.
    • 依赖
    • 开发者和贡献者
    • 插件列表
    • 报告列表
    • 插件执行
    • 插件配置

    持续中, 当 父级 POM 在 父目录../pom.xml 大概 在 本地仓库目录时 可用,
    否则的话须要指明 父级POM的相持地点.

     <parent>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../a-parent/pom.xml</relativePath>
    </parent>
    

 

Maven Pom

具有的 Maven POM 都继承自顶尖POM, 一流POM所处目录为: {Maven
HOME}/lib/maven-model-builder-{Maven Version}.jar 内
org.apache.maven.model 下的 POM-4.0.0.xml.

文件重大定义了:

  1. 独立的中远距离仓库, https://repo.maven.apache.org/maven2

    <repositories>
    <repository>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
    <layout>default</layout>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    </repository>
    </repositories>
    
  2. 为着力插件提供了默许的版本

咱俩和好建立的 POM最顶层继承自 一级 POM, 其次是所有的 父级POM, 自上向下
会一层层 覆盖以前的默许配置, 通过 mvn help:effective
可以查看当前项目的有用pom.

上面就开端一步步看POM.xml文件中的配置:

  1. version

    <major version>.<minor version>.<incremental version>-<qualifier>
    
    1.3.5-beta-01
    

    中间1为主版本号, 3为次版本号, 5为增量版本号,
    beta-01为限量版本号(alpha 和 beta). 即便版本号符合规则须要,
    则依照版本号来相比较, 否则依照字符串规则来开展相比. 比如 a10 是 排在
    a2面前的, 因而 a10属于旧版本, 但在我们的定义中, 却相应是相反的.

    本子界限配置形式:

    (loVersion, hiVersion) 不包含
    [loVersion, hiVersion] 包含

    <version>[3.8, 4.1.2]</version>
    

    当不指定上界/下界时, 则为上述/以下

    SNAPSHOT

    即使你在本子中行使了 字符串 SNAPSHOT, 表示项目正处在 活动的
    开发意况, Maven会在安装 或布置的时候将 符号展开为
    一个时刻和日期,转换为 UTC.(也就是快照版本)

    如在开立的时候, 默许为 0.1-SNAPSHOT, 而后将品种安顿到了 Maven仓库,
    Maven会将版本举行为 0.1-YYYYMMDD-HH24MISS-1, 那里的大运 为UTC时间.

    假设项目着重的一个零件正处在开发过程中, 倚重它的 SNAPSHOT版本,
    则在运作打造的时候, 会自动从仓库下载最新的 SNAPSHOT, 同时, 要依赖SNAPSHOT版本, 用户必须在 POM中利用 repository 和 pluginRepository
    开启下载 SNAPSHOT功效.

    <!--选择对应的 坐标, 将 enabled 属性设置为 true 即可-->
    <repositories>
        <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        </repository>
    </repositories>
    
    <pluginRepositories>
        <pluginRepository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        </pluginRepository>
    </pluginRepositories>
    

    而发表到 非 snapshot的 Maven仓库的营造不可以凭借于 SNAPSHOT版本,
    仅用于支付进度.

    LATEST 和 RELEASE

    当重视于一个插件 或 倚重, 可以接纳异乎平时值:

    LATEST: 最新公布的版本 或 快照版.

    RELEASE: 仓库中 最终一个非快照版本.

    在档次揭穿的时候, 尽量不要接纳 那多少个重点字, 仅在付出时使用

  2. 变量引用

    在Maven中有多个放置隐士变量:

    env: 表示 environment, 系统的环境变量, 如 ${env.PATH},
    须求注意的是亟需大写, 如 ${env.JAVA_HOME}

    settings: 这么些指的是 settings.xml中的属性, 但向来引用不成功.

    project: 引用当前 project中的属性 如 ${project.artifactId}.

    ${basedir}, 可以访问当前项目根目录

    Java系统质量

    凡是可以被 java.lang.System 中的 getProperties()方法访问的性质

    可以在Java中通过 System.getProperties().list(System.out);
    在Maven中经过 ${} 直接访问, 如 ${java.runtime.name}

    自定义属性:

    <properties>
        <attribute>value</attribute>
    </properties>
    

    访问形式即: ${attribute.value}

  3. 凭借范围

    <version>1.0</version>
    <scope>test</scope>
    

    compile: 编译范围, 默许范围, 在拥有的classpath都得以使用, 也会被包裹

    provided: 已提供范围, 只有当 JDK/容器已经提供该倚重之后才使用, 如在
    开发中 必要 Servlet API编译一个 Servlet,
    但在卷入公布之后这一部分应有由 容器/服务器本身来提供. 仅在编译时可用.
    不可传递, 不会打包.

    runtime: 运行时限制, 在编译时不要求, 在运作时需求.

    test: 测试范围, 仅在测试时必要, 测试运行, 测试编译.

    system: 系统范围, 必须提供 systemPath, 即本地jar文件的路径.

    可选看重:

    <version>1.0</version>
    <optional>true</optional>
    

    透过这种措施生命的依赖, 不会被传递. 需求在子项目中重复生命

  4. 借助于的传递

    test范围不会被传送, provided范围 仅在 provided中被传送, runtime 和
    compile 在 各样范围都会被传递.

    e.g. : A 包涵对 B的测试范围器重, B 包罗对 C的编译时倚重, 则
    C为A的测试范围倚重

    A:
    <dependency>
        <groupId>B</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
    B:
    <dependency>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0</version>
    </dependency>
    

    e.g. : A包蕴对 B的测试范围倚重, B包括对C的测试范围正视, 则 A与C非亲非故.

    A:
    <dependency>
        <groupId>B</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
    B:
    <dependency>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
    

    依傍追踪:

    在 Maven中, 假如八个品类倚重于同一个 project, 则Maven会找到
    所有爱抚中版本最新的 倚重, 作为最后的挑选, 所以可以撤除对应的依靠,
    且同时 可以 更换自个儿想要的版本.

    e.g.:

    <dependency>
        <groupId>B</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <exclusions>
            <exclusion>
                <groupId>C</groupId>
                <artifactId>C</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  5. 凭借管理

    那在从前 优化 已经涉及, 采用在父级项目中定义 dependencyManagement,
    pluginManagement, 在子级中沿用父级的本子, 仅须求列出所拔取的
    器重坐标, 而无需再次定义版本(如若定义子级版本, 父级就会被忽略);

    多模块项目:

    <modules>
        <module>project-a</module>
        <module>project-b</module>
    </modules>
    

    多模块项目标打包总是一个 POM 而非创设, 其中各样模块可以为 POM 只怕jar

    连串持续:

    <parent>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    

    可以被一连的品类:

    • 定义符: groupId 和 artifactId 必须有一个被重写,
      不大概有完全相同的坐标.
    • 依赖
    • 开发者和贡献者
    • 插件列表
    • 告诉列表
    • 插件执行
    • 插件配置

    继承中, 当 父级 POM 在 父目录../pom.xml 或许 在 本地仓库目录时 可用,
    否则的话要求指明 父级POM的相对地点.

     <parent>
        <groupId>C</groupId>
        <artifactId>C</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../a-parent/pom.xml</relativePath>
    </parent>
    

暂时告一段落.

相关文章