首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

maven3实战之座标和依赖(可选依赖)

2012-11-05 
maven3实战之坐标和依赖(可选依赖)maven3实战之坐标和依赖(可选依赖)----------假设有这样一个依赖关系,项

maven3实战之坐标和依赖(可选依赖)

maven3实战之坐标和依赖(可选依赖)

----------

假设有这样一个依赖关系,项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖:A-->B,B-->X(可选),B-->Y(可选)。根据传递性依赖的定义,如果所有这三个依赖的范围都是compile,那么X,Y就是A的compile范围传递性依赖。然而,由于这里X,Y是可选依赖,依赖将不会得以传递。换句话说,X,Y将不会对A有任何影响。

为什么要使用可选依赖这一特性呢?可能项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是一个持久层隔离工具包,它支持多种数据库,包括MySQL,PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一个数据库。

?

项目B的依赖声明如下:

<project>    <modelVersion>4.0.0</modelVersion>    <groupId>com.juvenxu.mvnbook</groupId>    <artifactId>project-a</artifactId>    <version>1.0.0</version>    <dependencies>        <dependency>            <groupId>com.juvenxu.mvnbook</groupId>            <artifactId>project-b</artifactId>            <version>1.0.0</version>           </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.10</version>        </dependency>    </dependencies></project>

最后,关于可选依赖需要说明的一点是,在理想的情况下,是不应该使用可选依赖的。前面我们可以看到,使用可选依赖的原因是某一个项目实现了多个特性,在面向对象设计中,有个单一职责性原则,意指一个类应该只有一项职责,而不是糅合太多的功能 。这个原则在规划maven项目的时候也同样适用。在上面的例子中,更好的做法是为mysql和postgresql分别创建一个maven项目,基于同样的groupId分配不同的artifactId。?

?

热点排行