《Maven实战》--- 坐标和依赖
1. 坐标详解
坐标表明在仓库中组件的位置,根据坐标可以从仓库中将组件定位,并且拉下来
例子
|
标签名 | 含义 |
---|---|
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