Maven依赖

Maven依赖

坐标详解:
  groupId:定义当前Maven项目隶属的实际项目
  artifactId:该元素定义十几项目中的一个Maven项目(模块)
  version:钙元素定义Maven项目当前所属的版本
  packaging:该元素定义Maven项目的打包方式,默认jar
  classifier:该元素用来帮助定义构建输出的一些附属构建

  上述5个元素,groupId、artifactId、version是必须定义的,packaging是可选的,classifier是不能直接定义的  

  项目构建的文件名是与坐标相对应的,一般规则为:artifactId-version[-classifier].pakaging


依赖范围:就是用来控制依赖与三种classpath(编译classpath、测试classpath、运行classpath)的关系
  compile:编译依赖范围,默认依赖范围。对于编译、测试、运行三种classpath都有效
  test:测试依赖范围,只对测试classpath有效
  provided:以提供依赖范围,对编译、测试classpath有效
  runtime:运行时依赖范围,对测试、运行classpath有效
  system:系统依赖范围,对编译、测试classpath有效,使用系统范围的依赖必须通过systemPath元素显示制动以来文件的路径


传递性依赖:

  假设某项目有一个compile范围的spring-core依赖,spring-core有一个compile范围的commons-logging依赖,那么commons-logging
  就会成为该项目的compile依赖,Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的方式引入到项目中来。


传递性依赖范围:
  假设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


依赖调解:
  假设项目A有这样的依赖:A--B--C--X(1.0)、A--D--X(2.0),X是A的传递性依赖,但是两个路径上有两个X版本,那么哪个X会被Maven解析使用呢?
  Maven依赖调解第一原则:路径最短优先
  假设项目A有这样的依赖:A--B--Y(1.0)、A--C--Y(2.0),路径一样长,那么那个Y会被Maven解析使用呢?
  Maven依赖调解第二原则:第一声明者优先,即如果B的依赖声明在C前面,那么Y(1.0)就会被解析


可选依赖:
  项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖,那么X、Y就是A的传递性依赖,假设范围都是compile,由于X、Y是可选依赖
  那么依赖传递不会得以传递,X、Y将不会对A有任何影响,使用<optional>元素表示某个项目为可选依赖(<optional>true</optional>) 

 1 <dependencies>
 2     <dependency>
 3         <groupId>mysql</groupId>
 4         <artifactId>mysql-connector-java</artifactId>
 5         <version>5.1.10</version>
 6         <optional>true</optional>
 7     </dependency>
 8     <dependency>
 9         <groupId>postgresql</groupId>
10         <artifactId>postgresql</artifactId>
11         <version>8.4-701.jdbc3</version>
12         <optional>true</optional>
13     </dependency>
14 </dependencies>

   可选依赖不会被传递。

排除依赖:
  使用exclusions元素声明排除依赖,exclusions可以包含一个或多个exclusion子元素,因此可以排除一个或多个传递性依赖,exclusion元素只需要groupId
  和artifactId,不需要version元素,因为只需要groupId和artifactId就可以唯一确定依赖图中的某个依赖,换句话说,Maven解析后的依赖,不可能出现
  groupId和artifactId相同,但是version不同的两个依赖

 1 <dependencies>
 2     <dependency>
 3         <groupId>com.juvenxu.mvnbook</groupId>
 4         <artifactId>project-b</artifactId>
 5         <version>1.0.0</version>
 6         <exclusions>
 7             <exclusion>
 8                 <groupId>com.juvenxu.mvnbook</groupId>
 9                 <artifactId>project-c</artifactId>  
10                 </exclusion>
11         </exclusions>
12     </dependency>
13 </dependencies>            


归类依赖:
  使用properties元素定义Maven属性,例如<properties><springframework.version>2.5.6</springframework.version></properties>,之后可以在version元素
  中将版本号为2.5.6的依赖用${springframework.version}代替,之后升级时,可直接修改properties属性即可

 1 <properties>
 2     <springframework.version>2.5.6</springframework.version>
 3 </properties>
 4 
 5 <dependencies>
 6     <dependency>
 7         <groupId>org.springframework</groupId>
 8         <artifactId>spring-core</artifactId>
 9         <version>${springframework.version}</version>
10     </dependency>
11     <dependency>
12         <groupId>org.springframework</groupId>
13         <artifactId>spring-beans</artifactId>
14         <version>${springframework.version}</version>
15     </dependency>   
16     <dependency>
17         <groupId>org.springframework</groupId>
18         <artifactId>spring-context</artifactId>
19         <version>${springframework.version}</version>
20     </dependency> 
21     <dependency>
22         <groupId>org.springframework</groupId>
23         <artifactId>spring-context-support</artifactId>
24         <version>${springframework.version}</version>
25     </dependency>
26 </dependencies>


优化依赖:
  mvn dependency:list     该命令可以查看当前项目的已解析依赖

               

  mvn dependency:tree     该命令可以查看当前项目的依赖树

                 

  mvn dependency:analyze   该命令可以分析项目当前的依赖情况,其中Used undeclared dependencies表示项目中使用到的,但没有显示声明的依赖,这种依赖意味着潜在的风险,因此,显示声明任何项目中直接使用到的依赖。
               Unused declared dependencies表示项目中没有使用到但显示声明的依赖,对于这样的依赖我们不应该简单的直接删除,因为analyze命令只会分析编译、测试代码需要用到的依赖,运行时需要的依赖就发现不了

                

 

posted on 2017-03-02 14:41  皮皮咚,我们走  阅读(152)  评论(1)    收藏  举报

导航