1、maven 坐标由groupId、artifactId、packaging、version、classifier定义。
2、classifier 用来帮助定义构建输出的一些附属构件。如,*javadoc.jar,*sources.jar。不能直接定义项目的classifier。
3、maven packaging 包括 jar、war、pom、maven-plugin、ear等。
4、依赖标签及其子标签

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope></scope>
<optional></optional>
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>

依赖范围

compile 默认。表示该依赖对主代码和测试都有效。
test 表示该依赖只对测试有效。即测试代码中 import JUnit 没有问题,但在主代码中 import JUnit就会造成编译错误。该依赖只会被加入到测试代码的classpath中。
provided 已提供依赖。编译、测试有效,运行时无效。如servlet-api,编译和测试时需要;但在运行时,由于容器已提供,不再需要。
runtime 运行时有效。测试和运行时有效,但在编译时不需要。如JDBC驱动实现,编译时只需要JDK提供的JDBC的接口;只有在执行测试和运行项目的时候才需要具体的JDBC驱动。
system 谨慎使用。


排除依赖

情景1:当前项目依赖了一个第三方依赖,但这个第三方依赖又依赖了另外一个SNAPSHOT版本的依赖,那么这个不稳定版本的依赖会影响到当前版本的稳定性。
情景2:Hibernate依赖 Sun JTA API,但由于版权的原因,该类库不存在于中央仓库,而Apache Geronimo 有一个对应的实现。这时就可以排除 Sun JTA API,再显示声明依赖 Apache Geronimo的 JPA API 实现。

    <dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>5.1.30</version>
<exclusions>
<exclusion>
<groupId>xxx-zzz</groupId>
<artifactId>zzz</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xxx-zzz</groupId>
<artifactId>zzz</artifactId>
<version>1.1.1</version>
</dependency>

exclusion 可以有多个;声明exclusions时不需要版本号。


可选依赖

A—>B、B->X(可选)、B->Y(可选),那么X和Y都不会传递给A。
项目B实现了两个特性,特性一依赖X,特性二依赖Y,而这两个特性是互斥的。
比如一个持久层构件支持多种数据库,它需要多个数据库的驱动程序,但在使用它的时候,只会依赖一个数据库。

    <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>myOracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
<optional>true</optional>
</dependency>

上面这两个依赖只对当前项目有效,当其它构件依赖当前构件时它们不会被传递。

其它构件依赖当前构件后,前者需要在其pom文件里显示声明其中一个。
理想情况下,不要使用可选依赖,写两个构件,分别实现两个特性。


依赖的传递性

比如当前项目依赖org.springframework:spring-core:2.5.6,而spring-core又依赖commons-logging,这时commons-logging就成为当前项目的依赖。
spring-core对commons-logging的依赖,可以在本地仓库里查看spring-core-x.x.x.pom看到。


依赖范围对传递性依赖的影响

当第二依赖的范围是compile时,依赖传递,传递依赖的范围和第一依赖的范围一致;当第二依赖范围是test的时候,依赖不会传递;当第二依赖范围是provided,只有第一依赖范围也是provided时,依赖传递,并且传递依赖的范围也是provided;当第二依赖范围是runtime,依赖传递,第一依赖是compile时,传递依赖是runtime,其它的都和第一依赖相同。


依赖调解

第一原则,就近原则:A->B->C->X(1.0)、A->D-X(2.0)
第二原则,pom中依赖顺序:A->B->X(1.0)、A->D-X(2.0)


优化依赖
mvn dependency:list
mvn dependency:tree
mvn dependency:analyze
Used undeclared dependencies,项目使用到但没有显示声明的。
Unused declared dependencies,项目中没有使用到但显示声明的。
Used undeclared dependencies风险:当前项目直接使用依赖A,比如通过import声明引入并使用,而A是传递依赖,当升级直接依赖时,相关传递依赖的版本也可能变化,比如A的一个接口改变,于是当前项目无法编译,不易排查错误。
Unused declared dependencies要注意:不应该简单的直接删除声明,要仔细分析。由于dependency:analyze只分析编译主代码和编译测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。

maven 依赖和坐标的更多相关文章

  1. Maven学习笔记—坐标和依赖

    Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...

  2. maven学习(九)——maven中的坐标、依赖以及仓库

    一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...

  3. Maven依赖(转)

    相同依赖级别,先加入的先依赖不同依赖级别,级别短的先依赖 version-->SNAPSHOTxxx-里程碑-->SNAPSHOT,alpha,beta,Release(RC),GA()s ...

  4. Maven依赖解析

    本文将记录Maven工程中依赖解析机制,内容包括: Maven依赖基本结构 从仓库解析依赖的机制 依赖传递性解析实例 1. Maven依赖基本结构 上篇文章记录了Maven依赖的聚合与继承,POM中依 ...

  5. 转:MAVEN依赖的是本地工程还是仓库JAR包?

    相信大家都碰见过 maven 配置的依赖或者是 jar 包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看 maven 依赖的文件的时候,就能直接查看到源码. 一.本地工程依赖 举个例 ...

  6. Maven依赖的是本地工程还是仓库jar包?

    相信大家都碰见过maven配置的依赖或者是jar包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看maven依赖的文件的时候,就能直接查看到源码. 一.本地工程依赖 举个例子,其架构如 ...

  7. maven依赖的描述

    maven的坐标和依赖 坐标和依赖,主要涉及的就是pom文件的头部和<dependencies>标签部分(1)pom文件的头部 这里头部不是指pom文件的开头<project> ...

  8. maven依赖管理

    maven依赖管理 1.依赖范围   (依赖相当于java中的import  是否需要导入别的jar包) 使用控制依赖与三种classpath(编译期,测试时期,运行时期)的关系 complie    ...

  9. Maven依赖传递、依赖传递排除、依赖冲突

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628429.html  一:Maven依赖传递 假如有Maven项目A,项目B依赖A,项目C依赖B.那么我们可 ...

随机推荐

  1. logcat -- 基本用法

    1.Log类是一个日志类,我们可以在代码中使用logcat打印出消息 常见的日志记录方法有: v(String,String)  --verbose 显示全部信息 d(String,String) - ...

  2. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  3. J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》

    1. FileInputStream    FileInputStream是一个文件输入节点流,它是一个字节流,它的作用是将磁盘文件的内容读取到内存中. FileInputStream的父类是Inpu ...

  4. J01-Java IO流总结一 《异常捕获》

    下面演示java中处理I/O操作时的异常的正确方式,总结自书籍,书名忘啦~ 先看一种不正确的方式 方式一: import java.io.FileInputStream; import java.io ...

  5. C# 对象相等性判断和同一性判断

    在日常开发中经常需要编写代码比较不同的对象.例如,有时需要将对象都放到一个集合中,并编写代码对集合中的对象进行排序.搜索或者比较. System.Object类有两个Equals方法,如下: 1.实例 ...

  6. Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

    Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...

  7. Fiddler Web Debugger安装后与浏览器之间的常用设置(辅助爬虫)(图文详解)

    不多说,直接上干货! 怎么让我们的浏览经过代理服务呢?如下来正确设置: 这里有个经验,最好用历史低版本的火狐浏览器.比如 http://ftp.mozilla.org/pub/firefox/rele ...

  8. C/C++ -- Gui编程 -- Qt库的使用 -- 标准对话框

    -----mywidget.cpp----- #include "mywidget.h" #include "ui_mywidget.h" #include & ...

  9. PHP PSR 标准

    引用他人文章:http://www.cnblogs.com/52php/p/5852572.html PHP中PSR-[0-4]代码规范 PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我 ...

  10. springboot-25-springboot 集成 ActiveMq

    消息的发布有2种形式, 队列式(点对点) 和主题式(pub/sub) 模式, 队列式发布后, 接收者从队列中获取消息后, 消息就会消失, 但任意消费者都可以从队列中接受消息, 消息只能被接受一次 主题 ...