Maven札记4-Maven坐标和依赖

Maven笔记4-Maven坐标和依赖

    Maven的坐标元素有:groupId,artifactId,version.packaging,version,classfier, 其中,前三个是必须的,

    packaging是可选的,而classfier是不能直接定义的。

    (1) groupId: 定义当Maven项目隶属的实际项目。 它的表示方式与Java的包命名方式相同,是域名的反向,

    例如org.dmwdp.authority,其中org.dmwdp表示DMWDP公司,authority是权限体系项目。

    (2) artifactId: 定义实际项目中的模块(Module)。 推荐使用实际的项目名称作为前缀,例如权限体系项目下

    的角色管理模块:dmwdp-role;默认情况下,Mavne生成的构建是以artifactId作为文件名称的。

    (3) version:定义Maven项目当前所处的版本。

    (4) packaging: 定义Maven 项目的打包方式,默认为JAR。

    (5) classfier: 用来帮助定义构建输出一些附属构件,附属构件与主构件对应。 如主构件为:org.dmwdp

    .authority-1.0.0.jar,则附属构件为org.dmwdp.authority-1.0.0-javadoc.jar或org.dmwdp.authority

    -1.0.0-sources.jar

    同时项目构件的文件名的一般规则时:artifactId-version[-classfier].packaging,上述5个元素中,

    groupId,artifactId,version是必须定义的,packaging是可选的,默认为jar,而classifier是不能直接定义的。

1. 依赖的配置

    标准的依赖配置:

    <project>

           .....

           <dependencies>

                <dependency>

                       <groupId>...</groupId>

                       <artifactId>...</artifactId>

                       <version>...</version>

                       <type>...</type><!--默认为JAR-->

                       <scope>...</scope>

                       <optional>...</optional>   <!--标记依赖是否可选-->

                       <exclusions>  <!--排除传递性依赖-->

                             <exclusion>

                                  ...

                             </exclusion>

                             ...

                </dependency>

           </dependencies>

           ...

    </project>

2. 依赖范围

    Maven在编译项目主代码的时候需要使用一套classpath(编译classpath),而在编译和执行测试的时候又会使用

    另外一套classpath(测试classpath),而最终运行项目的时候有使用一套classpath(运行classpath)。Maven

    的依赖范围就是用来控制依赖与这三种classpaht的关系。

    (1) compile

    编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运

    行三种classpaht都有效。

    (2) test

    测试依赖范围。只对于测试classpaht有效,如junit.jar.

    (3) provided

    已提供的依赖范围。对于编译和测试classpath有效,但在运行时无效,如servlet-api.jar.

    (4) runtime

    运行时依赖范围。对于测试和运行的classpaht有效,但在编译主代码时无效,如JDBC实现。

    (5) system

    系统依赖范围。与provided的依赖范围完全一致,但是system范围的依赖时必须通过systemPath元素显示的

    指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且与本机系统绑定,可能造成构建不可移  

    植,systemPath可以引用环境变量:

    <dependency>

         <groupId>java.sql</groupId>

         <artifactId>jdbc-stdext</artifactId>

         <version>2.0</version>

         <scope>system</scope>

         <systemPath>${JAVA_HOME}/lib/rt.jar</systemPath>

    </dependency>

    (6) import

    导入依赖范围,不会对上述三种classpath产生实际的影响。

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

    下表中最左边一行表示第一直接依赖,最上面一行表示第二直接依赖:

                   compile          test           provided             runtime

    compile    compile            -                     -                   runtime

    test          test                 -                     -                   test

    provided provided          -               provided             provided

    runtime    runtime            -                     -                   runtime

    说明:当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接

    依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided,值传递第一直接依赖范围

    也为provided的依赖,且传递性依赖的范围同样为provided;当第二直接依赖的范围是runtime的时候,传

    递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime.

4. 依赖调解

    (1) 例如:A->B-C->X(1.0),A->D->X(2.0),针对这种依赖,Maven采用的第一条依赖调解原则是:路径最近

    着优先。 上述依赖中X(1.0)的路径是3,而X(2.0)的路径是2,因此X(2.0)会被解析使用。

    (2) 例如:A->B-Y(1.0),A->C-Y(2.0),此时路径长度一样,Maven采用的第二条依赖调解原则是:第一声明者

    优先。 因此上述依赖中的Y(1.0)会被解析使用。

5. 排除依赖

    ...

    <dependencies>

        <dependency>

             <groupId>org.dmwdp.authority</groupId>

             <artifacId>project-b</artifactId>

             <version>1.0.0</version>

             <exclusions>

                 <exclusion>

                      <groupId>com.dmwdp.authority</groupId>

                      <artifactId>project-c</artifactId>

                 </exclusion>

             </exclusions>

        </dependency>

    </dependencies>

    ...

6. 优化依赖

    查看当前项目已解析依赖:mvn  dependency:list

    查看当前项目的依赖树:mvn dependency:tree

    当前项目依赖:mvn dependency:analyze