5. 依赖调节
假如现在有这么一个情况,项目A->(依赖)项目B->项目C->X(1.0),项目A->项目D->X(1.5)。那么项目A就不得不依赖于项目X。那我们这个项目A到底是下载X项目的哪个版本呢?Maven3对于这种情况有2个原则,第一个就是路径优先原则,第二个就是在配置文件pom.xml中谁先配置在前面谁解析使用。
项目路径就是指依赖的层级比如A->(依赖)项目B->项目C->X(1.0)就是X是A的第三层依赖,A->项目D->X(1.5)则是X是A的第二层依赖。那么根据原则1,X1.5版本会被优先选择使用。
6. 可选依赖
当一个项目出现了依赖可选——optional为true的时候说明,只有当前这个项目依赖于此可选依赖,而别的项目需要此项目的时候,此项目的可选依赖并不会像其他依赖类型似地,可选依赖不会传递给别的项目。在别的项目需要相关的可选依赖的时候还需要在pom.xml文件中显示的进行声明。其实可选依赖并不倡导,可选依赖就意味着此模块的职能比较复杂,不单一。一般替使用者完成了不该完成的功能。有点违背了Java设计模式的职能单一原则。
7. 依赖最佳化实现
1):归类依赖:就拿咱们这个邮件模块来说,用到了Spring2.5.6,其中用到了Spring项目的不同模块,现在开源的项目越来越讲究模块化,模块职能单一化。所以看到往往一个开源项目有很多jar,用到那个模块引入哪个jar,Spring、Hibernate都是这么做的。那么假如我们现在的项目要升级版本,Spring2.5.6已经不能满足了,要升级到3.0版本,怎么办?一个个去改以来的版本号?恩,也是个办法,不过有点笨拙。有另一个办法,不错,就跟Spring配置文件引入的那个资源文件原理一样,声明一个常量信息,所有用到的地方都用这个常量信息就够了,如下是我们修改后的配置
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.liuyan.account</groupId> <artifactId>MavenAccount-email</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <springversion>2.5.6</springversion> <junitversion>2.5.6</junitversion> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springversion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springversion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springversion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${springversion}</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>com.icegreen</groupId> <artifactId>greenmail</artifactId> <version>1.3.1b</version> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resource</directory> </resource> </resources> </build> </project>
2):排除依赖:假如现在有这么一个场景项目A->项目B-项目C,而A与C就形成了间接依赖,而C呢却又老是不稳定。那么构建项目A的时候如果下载了项目C的非稳定版本是很不安全的。那么不妨这么做,在项目A的依赖中肯定是要配置项目B的,在配置项目B的同时,强制让项目B排斥项目C,让A再加个依赖就是A用着较为稳定的版本C。配置如下
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springversion}</version> <exclusions> <exclusion> <groupId>org.apache</groupId> <artifactId>logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache</groupId> <artifactId>logging</artifactId> <version>1.1.0</version> </dependency>
使用IDE工具可以显示依赖图,当然可以通过命令
//显示依赖项 mvn dependency:list //显示依赖树 mvn dependency:tree //依赖项分析-找出那些依赖项没用 mvn dependency:analyze
8. 总结
我们这次开发了一个模块介绍了一下Maven的构建特性和jar包依赖特性。之后结合IDE阐述了Maven的pom.xml文件的一些内容——坐标。之后介绍了一下项目依赖的概念。