1、maven坐标元素

maven坐标元素包括:groupId、artifactId、version、packaging、classifier。

classifier:定义输出的附属构件。groupId、artifactId、version是pom.xml中必须定义的,packaging是可选的,classifier是不能直接定义的。

2、dependency中的元素

<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclusion>...</exclusion>
</exclusions>
</dependency>
</dependencies>
说明:
type:依赖的类型,对应项目坐标定义的packaging。
scope:依赖的范围。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。

classpath类型:编译时classpath、测试时classpath、运行时classpath。

3、scope依赖范围:compile、test、provided、runtime、system、import

1》compile:编译依赖范围。默认的依赖范围。对编译、测试、运行的classpath都有效。

2》test:测试依赖范围。只对测试classpath有效,编译主代码、运行项目的使用时无法使用此类依赖。编译测试代码、运行测试的时候可以使用。

3》procided:已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。举例servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要maven重复的引入一遍。

4》runtime:运行时依赖范围。对于测试和运行有效,但在编译主代码时无效。举例jdbc驱动,项目主代码编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体jdbc驱动。

5》system:系统依赖范围。该依赖与3种classpath的关系,和provided依赖范围完全一致。但是,使用system的依赖时必须通过systempath元素显式的指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植性。systempath元素可以引用环境变量,如:

<dependencies>
<dependency>
...
<scope>system</scope>
<systemPath>{java.home}/lib/rt.jar</systemPath>
...
</dependency>
</dependencies>

6》import(maven2.0.9及以上):导入依赖范围。该依赖范围不会对3种classpath产生实际的影响。

4、传递性依赖

1》传递性依赖:A包依赖于B包,B包又依赖于C包,则A包传递性的依赖于C包。如account-email有一个compile范围的依赖spring-core,spring-core有一个compile范围的commons-logging的依赖,那么commons-logging就会成为account-email的compile范围依赖,commons-logging是account-email的一个传递依赖。

2》传递性依赖和依赖范围:依赖范围不仅可以控制依赖与3种classpath的关系,还对传递性依赖产生影响。如上面的account-email对于commons-logging这一传递性依赖的范围也就是compile。A依赖于B,B依赖于C,我们就说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。(如图:中间交叉范围为传递性依赖的范围)

第一直接依赖范围\第二直接依赖范围 compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

3》依赖调解:

1>依赖调解第一原则:路径最近者优先

例如:A->B->C->X(1.0)、A->D->X(2.0),X(1.0)版本的路径长度为3,X(2.0)的路径长度为2,因此X(2.0)版本会被解析使用。

2>依赖调解第二原则:在路径相等的情况下,第一声明者优先,在pom中依赖声明的顺序决定了谁会被解析使用。

例如:A->B->Y(1.0)、A->C->Y(2.0),如果B的依赖声明在C之前,那么Y(1.0)就会被解析使用。

4》可选依赖

5》排除依赖

6》归类依赖

7》优化依赖

#maven自动解析项目的直接依赖、传递性依赖、调解依赖冲突、确保依赖中
#只有唯一版本的依赖存在,得到的依赖称为已解析依赖。
#可以使用如下语句查看项目已解析依赖:
mvn dependency:list
C:\fyliu\lfyTemp\mvnProject\mvn-archetype-generate\hello-world>mvn dependency:li
st
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.lfy.mvnbook:hello-world >---------------------
[INFO] Building hello-world 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ hello-world ---
[INFO]
[INFO] The following files have been resolved:
[INFO] junit:junit:jar:4.11:test
[INFO] org.hamcrest:hamcrest-core:jar:1.3:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.593 s
[INFO] Finished at: --15T15::+:
[INFO] ------------------------------------------------------------------------ C:\fyliu\lfyTemp\mvnProject\mvn-archetype-generate\hello-world>
#查看项目的依赖树
mvn dependency:tree
C:\fyliu\lfyTemp\mvnProject\mvn-archetype-generate\hello-world>mvn dependency:tr
ee
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.lfy.mvnbook:hello-world >---------------------
[INFO] Building hello-world 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ hello-world ---
[INFO] com.lfy.mvnbook:hello-world:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.144 s
[INFO] Finished at: --15T15::+:
[INFO] ------------------------------------------------------------------------ C:\fyliu\lfyTemp\mvnProject\mvn-archetype-generate\hello-world>
#分析依赖,可以找出被隐式引用但是没有明确声明的依赖
#Unused declared dependencies found 指没有使用但是声明了的依赖,不一定完全正确
#Used declared dependencies 指项目中使用但没有显式声明的依赖
mvn dependency:analyze
C:\fyliu\lfyTemp\mvnProject\mvn-archetype-generate\hello-world>mvn dependency:an
alyze
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.lfy.mvnbook:hello-world >---------------------
[INFO] Building hello-world 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> maven-dependency-plugin:2.8:analyze (default-cli) > test-compile @ he
llo-world >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-worl
d ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\fyliu\lfyTemp\mvnProject\mvn-arche
type-generate\hello-world\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello-world --- [INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ he
llo-world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\fyliu\lfyTemp\mvnProject\mvn-arche
type-generate\hello-world\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hello-w
orld ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< maven-dependency-plugin:2.8:analyze (default-cli) < test-compile @ he
llo-world <<<
[INFO]
[INFO]
[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ hello-world ---
[WARNING] Unused declared dependencies found:
[WARNING] org.springframework:spring-core:jar:2.5.:compile
[WARNING] org.springframework:spring-beans:jar:2.5.:compile
[WARNING] org.springframework:spring-context-support:jar:2.5.:compile
[WARNING] javax.mail:mail:jar:1.4.:compile
[WARNING] com.icegreen:greenmail:jar:1.3.1b:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.885 s
[INFO] Finished at: --15T16::+:
[INFO] ------------------------------------------------------------------------ C:\fyliu\lfyTemp\mvnProject\mvn-archetype-generate\hello-world>

Maven - Maven3实战学习笔记(2)坐标和依赖的更多相关文章

  1. Maven - Maven3实战学习笔记(1)Maven使用入门

    1.maven安装 1>http://maven.apache.org/download.cgi下载apache-maven-3.6.1 2>解压缩安装包到指定的文件夹,如C:\fyliu ...

  2. Maven - Maven3实战学习笔记(3)使用maven构建Web应用

    1.jetty-maven-plugin自动化测试Web应用工具 <plugin> <groupId>org.mortbay.jetty</groupId> < ...

  3. Redis in Action : Redis 实战学习笔记

    1 1 1 Redis in Action : Redis  实战学习笔记 1 http://redis.io/ https://github.com/antirez/redis https://ww ...

  4. seaJs学习笔记之javascript的依赖问题

    之前分别为大家介绍了有关javascript中的冲突和性能问题,今天为大家介绍一下有关javascript中的依赖问题.我们将继续就之前javascript中性能问题继续介绍. 先来回顾一下性能问题的 ...

  5. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  6. Maven相关内容学习笔记一:基本配置和使用

    首先必须推荐的这本书<Maven实战> 许晓斌,机械工业出版社 Maven简介 其实使用Maven也有很久时间了,大部分都是别人建好了工程我使用一下,实际上并没有非常详细的使用经验,这次到 ...

  7. maven权威指南学习笔记(三)——一个简单的maven项目

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  8. maven 一个简单项目 —— maven权威指南学习笔记(三)

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  9. Angular4学习笔记(四)- 依赖注入

    概念 依赖注入是一种设计思想,并不是某一类语言所特有的,因此可以参考开涛大神关于学习Java语言的Spring框架时对其的解释: DI-Dependency Injection,即"依赖注入 ...

随机推荐

  1. LAMP 搭建,wordpress.xcache,powerdns及poweradmin

    一,概念 CGI: CGI全称是通用网关接口(Common Gateway Interface),是外部应用程序与与服务器之间的接口标准,是在CGI程序和web服务器之间传递信息的规程 CGI是一段程 ...

  2. Python实用黑科技——找出最大/最小的n个元素

    需求: 快速的获取一个列表中最大/最小的n个元素. 方法: 最简便的方法是使用heapq模组的两个方法nlargest()和nsmallest(),例如: In [1]: import heapqIn ...

  3. python-Django框架

    常用命令 生成应用 python manage.py start app(app_name) 开启服务器 python manage.py runserver 0.0.0.0:8001 声称以及修改数 ...

  4. Java使用FileOutputStream写入文件

    From: http://beginnersbook.com/2014/01/how-to-write-to-a-file-in-java-using-fileoutputstream/ /* 使用F ...

  5. ArrayList类源码浅析(三)

    1.看一个示例 运行上述代码,抛出一个异常: 这是一个典型的并发修改异常,如果把上述代码中的125行注释,把126行打开,运行就能通过了: 原因: 1)因为在迭代的时候,使用的是Itr类的对象,在调用 ...

  6. “fatal error: hdf5.h: 没有那个文件或目录”解决方法

    問題一: Installing Caffe without CUDA: fatal error: cublas_v2.h No such file: 在Makefile.config中修改,將CPU_ ...

  7. Android Studio设置国内镜像代理

    点击主面板右下角的Configure –> settings –> Appearance & Behavior –> System Settings –> HTTP P ...

  8. leetcode 215 第K个最大的元素

    此问题可转化为Top K问题进行考虑,当用小顶堆选出K个最大值时,堆顶的元素即为第k大的元素 class Solution { public: int findKthLargest(vector< ...

  9. PE盘制作

    我这里以大白菜为例来讲解这个一条龙的服务: 1.去大白菜官网下载一U盘制作工具: 2.准备一个4G以上的U盘(我这里建议16G比较好,这样制作完成之后,我们还可以拷贝几个常用的镜像进去,方便今后使用) ...

  10. <img>的title和alt有什么区别

    1.title是全局属性之一,用于为元素提供附加的advisory information.通常当鼠标滑动到元素上的时候显示. 2.alt是<img>的特有属性,是图片内容的等价描述,用于 ...