1. 坐标详解

坐标表明在仓库中组件的位置,根据坐标可以从仓库中将组件定位,并且拉下来

例子

<dependency>

    <groupId>org.sonatype.nexus</groupId>

    <artifactId>nexus-indexer</artifactId>

    <version>2.0.0</version>

    <packaging>jar</packaging>

</dependency>

标签名

含义

gruopId groupId一般有组织.项目,一般是域名反写,例如上面,org.sonatype表示Sonatype建立一个非盈利性组织,nexus表示Nexus一个实际项目,该gruopId和nexus.sonatype.org对应
artifactId 这个一般是定义实际项目中一个maven项目,一个项目可能由多个maven组成,这个就是定义那个子模块的名称,但是应该用实际上面做前缀,方便寻找实际构件,上面例子就是用了nexus做前缀
version 版本号
packaging 打包的方式,最后是形成war包还是jar包,默认不写就是jar包
classifier 该元素用来帮组定义构建输出一些附属构件,例如doc,sources包之类

 

上面五个元素groupId,artifactId,version必须的,packaging可选,classifier不可以直接定义

项目的构件的文件名是与坐标相对应的,一般的规则为artifactId-version [-classifier ] .packaging 例如上面例子构件就是nexus-indexer-2.0.0.jar,附属构件有nexus-indexer-2.0.0-javadoc.jar

 

  • 2. 依赖的配置

标签名

含义

groupId,artifactId,version 见上述
type 依赖的类型,对应packaging
scope 依赖范围
optional 标记依赖是否可选
exclusions 用来排除传递性依赖

 

3. 依赖的范围

maven在编译项目主代码的时候,需要使用一套classpath,jar包文件以依赖的方式被引入到classpath中,其次maven,在编译和执行测试的时候会使用另一套classpath

依赖范围就是用来控制三种classpath的,编译classpath,测试classpath,运行classpath

  • compile:编译,测试,运行都有效
  • test:只对测试的classpath有效,其他不会引入
  • provided:对于编译,测试有效,在运行时无效,例子servlet-api,运行时候容器提供
  • runtime:对测试,运行有效,对编译无效,例子jdbc,编译之后只需要jdk的接口即可
  • system:与provide完全一致,必须通过systemPath显示指定范围
  • import  聚合与继承当中讲解
     

4. 传递性依赖和依赖范围

  第二依赖        
    compile test provided runtime
直接依赖 compile compile ---- ---- runtime
  test test ---- ---- test
  provided provided ---- provided provided
  runtime runtime ---- ---- runtime

 

5. 依赖调解与可选依赖

A->B->C→X(1.0).       A->D->X(2.0)

路径最近者优先,上述依赖X(2.0)

在路径相同情况下,在pom中先声明者优先

 

可选依赖不会传递

A->B,B->X(可选),B→Y(可选),

A不会依赖X,Y