Maven坐标详解
fastjson坐标
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
工具包坐标
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.7</version>
groupId
定义当前项目隶属的实际项目。groupId
的定义类似于包名的定义,一般是到域名的方式后面跟实际项目名。倒域名可以指定项目的所属组织或公司,实际项目名则指定项目的真实名称。
例如:cn.hutool
artifactId
定义实际项目中的一个Maven
模块,一般命名方式为实际项目名作为前缀,后面是模块名
例如:hutool-all
version
定当前maven项目所处的版本
packaging
定义maven
项目的打包方式,一般有三种,分别是jar
,war
和pom
。打包方式一般对应于打包后文件的扩展名。如果不指定,默认为jar
classifier
定义构件输出的一些附属构件。不能直接定义项目的classifier
,是由插件帮助生成。最为典型的例子就是javadoc
和sources
。
查找某个模块的坐标
技巧:直接在百度中输入maven
后面跟你想查找的jar
的名字就可以了
依赖范围详解
maven
有一个非常重要的功能,就是解决项目的依赖,曾经我们在使用手动导包时,需自己解决依赖问题,小项目处理起来还好,大型项目中的依赖非常多,很难捋清楚依赖,易出现jar包冲突
或找不到jar
的问题。maven
可以帮我们很轻松解决此类问题。
引入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
<scope>runtime</scope>
</dependency>
</dependencies>
学习依赖范围需弄明白三件事:
为什么需要指定依赖范围
以junit为例,我们只希望在测试的时候使用,编译或运行项目的时候我们并不想引入junit的依赖,需要如何做?
以mysql驱动为例,我们只希望在测试和运行的时候引入依赖,开发中防止使用错类不想引入,需要如何做?
以seeervlet-api为例,我们只希望在编译和测试的时候使用,运行的时候并不想引入依赖,需要如何做?
依赖范围有哪些
名称 | 说明 |
compile | 编译、测试、运行都有效 |
test | 测试有效 |
provided | 编译、测试有效,运行无效 |
runtime | 编译无效、测试和运行有效 |
system | 编译、测试有效,运行无效 |
import | 特殊 |
依赖范围实现的原理
定义多套classpath
,编译时是一套classpath
,测试时是一套classpath
,运行时是一套classpath
。根据scope
属性值来判断是否进行加载jar
依赖的传递
Maven的依赖传递也是一个非常重要的特性。例如,A
依赖B
,B
依赖C
,那么A
也依赖C
注:依赖的传递既然能带来好处,同时也会带来一些问题
问题1:
A -> B -> C -> D(1.0)
A -> E -> D(2.0)
A会依赖D的哪一个版本?
maven会选择路径最浅的版本
问题2:
A -> B -> D(1.0)
A -> E -> D(2.0)
A项目会依赖D的哪一个版本?
配置在上面的优先
问题3:
解决方案1:为新添加的这个依赖于DataBaseService
的类新建一个模块,让这个新建的模块依赖于DataBaseService
模块
解决方案2:将新添加的这个依赖于DataBaseService
的类,移动至DataBaseService
模块
分析依赖
依赖列表
mvn dependency:list
依赖树
mvn dependency:tree
依赖分析
mvn dependency:analyze
总结:上面这几条命令基本不会使用,开发过程中都是使用IDE自带的工具或插件
工具1:
工具2:
插件 Maven Helper插件
打开pom.xml
后,就会多出Dependency Analyzer
选项了
排除依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
</exclusions>
</dependency>