MAVEN-排除依赖,归类依赖,优化依赖

排除依赖

传递性依赖会给项目隐式地引入很多依赖, 这极大地简化了项目依赖的管理, 但是有些时候这种特性也会带来问题。例如, 当前一个项目有一个第三方依赖, 而这个第三方依赖由于某些原因依赖了另一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目。这时候就需要排除掉该SNAPSHOT, 并且在当前项目中声明该类库的某个正式发布的版本。 还有一些情况,你可能也想要替换某个传递性依赖,比如 Sun JTA API, Hibernate 依赖于这个JAR, 但是由于版权的因素,该类库不在中央仓库中,而Apache Geronimo 项目有一个对应的实现。这时就可排除Sun JTA API, 再声明Geronimo的JTA API实现, 如下:

<dependencies>
   <dependency>
      <groupId>com.rogueq.mvnbook</groupId>
      <artifactId>project-b</artifactId>
      <version>1.0.0</version>
      <exclusions>
         <exclusion>
            <groupId>com.rogueq.mvnbook</groupId>
            <artifactId>project-c</artifactId>
         </exclusion>
      </exclusions>
   </dependency>
   <dependency>
      <groupId>com.rogueq.mvnbook</groupId>
      <artifactId>project-c</artifactId>
      <version>1.0.0</version>
   </dependency>
</dependencies>

上述项目中,项目依赖项目B,但是由于一些原因,不想引入传递性依赖C, 而是想自己显示地声明对于项目C1.0.0版本的依赖。代码中使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusion的时候只需要声明groupId和artifactId, 而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。

 

归类依赖

在Java开发中,竟然需要导入很多关于Spring Framework的依赖,而这些依赖的版本往往都是相同的,此时可以如下声明,统一依赖版本:

<properties>
   <springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
   <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-context-support</artifactId>
      <version>${springframework.version}</version>
   </dependency>
</dependencies>

通过使用properties元素定义Maven属性,该例中定义了springframework.version子元素,其值为2.5.6。 有了这个属性定义之后,Maven运行的时候会将POM中所有的${springframework.version}替换成实际值2.5.6。也就是说, 可以使用美元符号和大括弧环绕的方式引用Maven属性。

 

优化依赖

运行如下命令查看当前项目的已解析依赖:

maven dependency:list 

运行如下项目查看当前项目的依赖树:

mvn dependency:tree

运行如下命令可以帮助分析当前项目的依赖:

mvn dependency:analyze

注意: dependency:analyze只会分析编译主代码和测试代码需要的依赖, 一直执行测试和运行时需要的依赖就发现不了。

注: 摘取自《Maven实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值