Maven坐标和依赖(三)

接下来介绍一下Maven的坐标和依赖。

1. Maven坐标

  依赖的底层基础就是坐标。在实际生活中我们可以将地址看成一种坐标。而Maven为构件引入坐标的概念。以前当我们需要Spring Framework依赖的时候,就回去Spring官网查找,当需要log4j的依赖时,我们又回去Apache网站查找,这样就花费大量的时间在搜索、浏览网页上。现在Maven定义了一组规则:世界上任何一个构件都可以使用Maven坐标唯一标识。Maven坐标元素包括:groupId, artifactId, version, packaging, classifier。

2. 坐标详解

1)groupId: 定义当前Maven项目隶属的实际项目。groupId的表示方式与Java报名的表示方式类似,通常与域名反向一一对应。如:org.springframework.
2)artifactId: 该元素定义实际项目的一个Maven项目(模块),推荐使用实际项目名称作为artifactId的前缀。如:spring-core. 默认情况下Maven生成的构件会以artifactId作为开头,如spring-core-3.1.0.jar。
3)version: 该元素定义Maven项目当前所处的项目的版本。
4)packaging: 该元素定义Maven项目的打包方式。当不定义packaging的时候,Maven会使用默认值jar。
5)classifier: 该元素用来帮助定义构建输出的一些附属软件。
以上5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的,而classifier是不能直接定义的。

3. 依赖配置

<project>
  <dependencies>
    <dependency>
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
      <type>...</type>
      <scope>...</scope>
      <optional>...</optional>
      <exclusions>
        <exclusion>
        ...
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

每个依赖都包括的元素有:
groupId、artifactId和version:依赖的基本坐标。
type: 依赖的类型,对应于项目坐标定义的packagin。大多情况下不必声明。
scope: 依赖的范围。
optional: 标记依赖时候可选。
exclusions: 用来配出传递性依赖。

4. 依赖范围

1)compile:编译依赖范围。该依赖对于编译、测试、运行三种classpath都有效。如spring-core。

2)test:测试依赖范围。只对测试范围classpath有效。经典的例子是JUnit。

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

4)runtime:运行时依赖。对于测试和运行classpath有效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口。

5)system:系统依赖范围。与classpath的关系和provided一样。

6)import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。

5. 依赖的传递性

顾名思义,很多人都知道A->B, B->C,那么A->C.但是在Maven中传递的范围是会改变的,这个由maven自身处理。如下图:
第一列为第一依赖,第一行为第二依赖,单元格内为传递范围。


compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

6. 依赖调解

如果有多个相同的依赖,Maven会根据一定的规则来确定:
传递路径长度取最短原则,传递路径长度相等时,采取最先申明原则。

7. 排除依赖


依赖包里有些包不稳定,可以排除该依赖包,如:
<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.4.1</version>
  <exclusions>
    <exclusion>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>javax.activation</groupId>
  <artifactId>activation</artifactId>
  <version>1.1</version>
</dependency>


8. 分类依赖

当同一个模块,所依赖的几个模块版本都相同时,可以使用maven里的属性做分类依赖,依赖版本升级时改一处即可。

<properties>
  <springframework.version>3.2.5</springframework.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${springframework.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${springframework.version}</version>
    <type>pom</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${springframework.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${springframework.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
</dependencies>


9. 优化依赖


1) mvn dependency:list

查出依赖列表
2) mvn dependency:tree
查出依赖列表,按tree排列
3) mvn dependency:analyze
查找出在编译和测试中未使用但显示声明的依赖  

转载于:https://my.oschina.net/liangbo/blog/178753

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值