Maven之依赖管理
来源:互联网 发布:看不见的城市 知乎 编辑:程序博客网 时间:2024/06/05 12:44
Maven三大功能:依赖管理、项目构建、项目知识管理;需要上项目最重要的功能是首先能用Maven正确添加需要的JAR(依赖管理)
classifier:用来帮助定义构建输出的一些附属构建;不能直接定义项目的classifier,因附属构建不是项目直接默认生成的,而是由附加的插件帮助生成。
1. 依赖的配置
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- modelVersion 指定POM的版本,对于maven2及maven3来说,它只能是4.0.0 --> <modelVersion>4.0.0</modelVersion> <!-- groupId、artifactId、version、package和classifier可唯一确定Maven坐标; --> <!-- groupId 项目组的ID,一般是com.公司组织名.项目名 --> <groupId>com.公司名.项目名</groupId> <!-- artifactId 该项目在项目组中的ID --> <artifactId>project-xxx</artifactId> <!-- version 是项目的版本号,用于维护项目的升级和发布;SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本 --> <version>0.0.1-SNAPSHOT</version> <!-- Maven项目的打包方式, 有jar、war、pom等方式, 默认打包方式jar --> <packaging>pom</packaging> <!-- name 一般没有实际的用处, 只是用于标识该项目, Maven产生的文档用 --> <name>project-yyy</name> <!-- 项目主页的URL, Maven产生的文档用 --> <url>http://maven.apache.org</url> <!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。坐标包括groupID,artifactID和version。--> <parent> <groupId>...</groupId><artifactId>...</artifactId><version>...</version> </parent> <!-- 描述了项目相关的所有依赖。这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> </dependencies> <build> <finalName>maven01</finalName> </build></project>
2. 依赖范围
依赖范围用来控制依赖与与这三种classpath(编译classpath、测试classpath、运行classpath)的关系。
Maven有四种依赖范围:
1) compile:编译依赖范围(默认的依赖范围); 对于编译、测试、运行三种 classpath 都有效,即在编译、测试和运行的时候都使用该依赖;
2) test:测试依赖范围; 在编译主代码和运行项目时无法使用此类依赖。典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要;
3) provided:已提供依赖范围,对于编译和测试classpath有效, 但在运行时无效;
4) runtime:运行时依赖范围,对于测试和运行classpath有效,但是在编译主代码时无效;
5) system:系统依赖范围, 该依赖与三种classpath的关系和provided依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径; 由于此类依赖不是通过Maven仓库解析的, 而且往往与本机系统绑定, 可能造成构建的不可 移植所以可能会造成建构的不可移植,须谨慎使用。
3.传递性依赖
B->C(compile) 第二关系: b依赖c compile
当在A中配置
<dependency>
<groupId>com.B</groupId>
<artifactId>B</artifactId>
<version>1.0</version>
</dependency>
则A会自动导入c包。
4.依赖调解
A->B->C->X(1.0)
A->D->X(2.0)
Maven依赖调解的第一原则,路径最短者优先。如果两个版本的依赖都被解析,会造成依赖的重复,必须选择其中一个;
由于只能引入一个版本的包,此时Maven按照最短路径选择导入x(2.0)
Maven依赖调解的第二原则,第一声明者优先。多个声明的路径一样长,则只解析最前面的那个声明。
A->B->X(1.0)
A->D->X(2.0)
路径长度一致,则优先选择第一个,此时导入x(1.0)
5.可选依赖
然而,因为这个项目不可能被分成子模块,所以这些依赖被声明成可选的。如果一个用户想要使用和一个可选的依赖相关的功能,他们将不得不在他们自己的项目中重新声明可选的依赖。用这种方法处理这种情况不是的最好的方式,但是可选的依赖和依赖排除也是一个权宜的解决办法。
<project> ... <dependencies> <!-- declare the dependency to be set as optional --> <dependency> <groupId>sample.ProjectA</groupId> <artifactId>Project-A</artifactId> <version>1.0</version> <scope>compile</scope> <optional>true</optional> <!-- value will be true or false only --> </dependency> </dependencies></project>
6.排除依赖
由于maven2.x会传递解析依赖,所以很有可能一些你不需要的依赖也会包含在工程类路径中。例如,一些你依赖的工程可能没有正确的声明它们的依赖集。为了解决这种特殊情况,maven2.x已经引入了显式排除依赖的概念。排除是设置在pom中指定的依赖上,并且有指定的groupId和artifactId来标注。当你构建工程时,该物件不会像解析加载依赖一样被加载到你工程的类路径中。
1. 如何使用排除依赖
我们在pom中的<dependency>段下面加上<exclusions>标签。
7.归类依赖
如博文最上面Spring的不同JAR为同一版本,为方便后期修改和管理,增加了个自定义的property,以后修改只需要修改property里的版本号即可;
<properties> <springframework.version>4.3.4.RELEASE</springframework.version></properties><dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springframework.version}</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${springframework.version}</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springframework.version}</version></dependency>
8.优化依赖
- Maven之依赖管理
- Maven 之 依赖管理
- Maven讲解之 依赖管理
- maven项目管理之-07-依赖传递
- maven项目管理之-08-依赖冲突
- maven依赖管理
- maven 项目依赖管理
- Maven的依赖管理
- maven 项目依赖管理
- Maven 依赖管理
- maven依赖管理
- maven 管理依赖
- Maven依赖管理
- maven 依赖管理
- Maven的依赖管理
- Maven管理依赖
- maven--依赖管理
- Maven 依赖管理
- 博为峰Java技术文章 ——JavaSE Swing使用ListModel方式创建列表框III
- 从零移植uboot 2017 到nuc970(第二天)
- Unable to find vcvarsall.bat的错误的解决办法
- 深入理解多态,为什么说静态成员无多态特性?
- PAT(乙) 1001.害死人不偿命的(3n+1)猜想 (15)
- Maven之依赖管理
- Hwadee实训--day04
- Java中vector的使用详解
- 从零移植uboot 2017 到nuc970(第三天)
- 我的PCB电路设计(一)
- URL加载系统----iOS工程师必须熟练掌握
- VC6.0调用webservice方法
- 图像处理与计算机视觉:基础,经典以及最近发展(3)计算机视觉中的信号处理与模式识别
- 互斥量和信号量