《maven实战》读书笔记(二)——坐标与依赖

坐标是maven的核心概念之一,另外几个核心概念是依赖、仓库、生命周期、插件

本文总结一下坐标和依赖的几个要点

“坐标”是maven引入项目构建的概念,此前ant是没有这个概念的。maven将jar包、项目的构建成品等,都统一看做是“构件”,而坐标就是构件的唯一标识。通过坐标,maven就能找到任何一个构件,并且管理依赖关系

坐标由以下元素组成:groupId、artifactId、version、packaging、classifier

groupId,是当前maven项目隶属的实际项目。而不仅仅是到组织层面,因为一个组织往往会有多个实际项目,如果groupId仅仅指向组织,那就无法标识实际项目的模块了。实际项目和maven项目,是一个“一对多”的关系

比如说,我们接下来要做的任务管理重构项目,准备基于maven构建,那这个项目的groupId就应该是com.huawei.wfm.task

artifactId,即当前的maven项目,可以视为实际项目的一个模块,推荐的做法,是用实际项目名称,作为artifact的前缀

比如说,接下来这个任务子系统,有一个模块是流程引擎,那么这个maven项目的aftifactId就应该是task-process

version,就很好理解了,是项目的版本号

packaging,是项目的打包方式,常见的有jar、war等

classifier,是用来帮助定义构建输出的一些附属构建,如javadoc、source等,需要依赖插件,不能直接定义

下面说说“依赖”的一些要点:

1、首先需要知道,maven构建项目的时候,会有3套classpath。编译项目主代码的classpath、编译和执行测试代码的classpath、实际运行时的classpath

2、依赖范围,和上面说的第一点密切相关

maven有以下几种依赖范围,包括compile、test、provided、runtime、system、import

如果在pom中没有特别声明scope的话,默认是compile的依赖范围

3、依赖传递

这个很好理解,比如项目依赖了spring-framework,而spring-framework又是依赖common-logging的,那么项目也就依赖common-logging

要注意的是,依赖传递的概念,需要和上面说的依赖范围一起理解

另一个问题是,在实践中,有时候需要排除传递性依赖。比如说项目A依赖项目B,而项目B依赖项目C的1.0版本。但是项目A希望依赖项目C的2.0版本,这个时候就需要在项目A的pom中显式的声明
<dependencies>
    <dependency>
        <artifactId>project-b</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>project-c</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <artifactId>project-c</artifactId>
        <version>2.0</version>
    </dependency>
</dependencies>

4、依赖调解

这里有2个原则:第一个是路径最近者优先,第二个是第一声明者优先

猜你喜欢

转载自kyfxbl.iteye.com/blog/1662212