排除依赖
传递性依赖会给项目隐式地引入很多依赖, 这极大地简化了项目依赖的管理, 但是有些时候这种特性也会带来问题。例如, 当前一个项目有一个第三方依赖, 而这个第三方依赖由于某些原因依赖了另一个类库的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实战》