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.传递性依赖

A->B(compile)     第一关系: a依赖b   compile
B->C(compile)     第二关系: b依赖c   compile

当在A中配置
<dependency>  
  <groupId>com.B</groupId>  
  <artifactId>B</artifactId>  
  <version>1.0</version>  
</dependency>
则A会自动导入c包。

关于传递依赖的结果比较不理解,http://seanzhou.iteye.com/blog/1688740有篇内容在介绍,我没大看懂,功力不够额;

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.可选依赖

当不可能把一个项目分裂成子模块(不管什么原因)的时候,我们可以使用可选的依赖。它的思想就是:在项目中一些依赖仅仅被某些功能使用,并且如果这个功能不被使用,这个依赖就不需要。理想情况下,根据核心的功能性项目,一个功能被分成子模块… 如果你决定使用子模块的功能,因为你必须需要他们的全部,所以新的子项目仅仅有不可选的依赖。
然而,因为这个项目不可能被分成子模块,所以这些依赖被声明成可选的。如果一个用户想要使用和一个可选的依赖相关的功能,他们将不得不在他们自己的项目中重新声明可选的依赖。用这种方法处理这种情况不是的最好的方式,但是可选的依赖和依赖排除也是一个权宜的解决办法。
为什么使用可选依赖?
声明可选的依赖,重点不是为了节省空间/内存,因为这些jar最后可能被打进一个WAR、EAR、EJB等,重点是当一个用户为了使用一个项目时来控制实际的依赖列表。包含了一个错误的jar可能会违反一个许可协议,引起环境变量问题等。
怎么使用可选依赖?
<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.优化依赖

暂且先不讲了

0 0
原创粉丝点击