5.9.2 归类依赖

在5.3.1节中,有很多关于Spring Framework的依赖,它们分别是org.springframework:spring-core:2.5.6、org.springframework:spring-beans:2.5.6、org.springframework:spring-context:2.5.6和org.springframework:spring-context-support:2.5.6,它们是来自同一项目的不同模块。因此,所有这些依赖的版本都是相同的,而且可以预见,如果将来需要升级Spring Frame-work,这些依赖的版本会一起升级。这一情况在Java中似曾相识,考虑如下简单代码(见代码清单5-10)。

代码清单5-10 Java中重复使用字面量


public double c(double r)

{

return 23.14r;

}

public double s(double r)

{

return 3.14rr;

}


这两个简单的方程式计算圆的周长和面积,稍微有经验的程序员一眼就会看出一个问题,使用字面量(3.14)显然不合适,应该使用定义一个常量并在方法中使用,见代码清单5-11。

代码清单5-11 Java中使用常量


public final double PI=3.14;

public double c(double r)

{

return 2PIr;

}

public double s(double r)

{

return PIrr;

}


使用常量不仅让代码变得更加简洁,更重要的是可以避免重复,在需要更改PI的值的时候,只需要修改一处,降低了错误发生的概率。

同理,对于account-email中这些Spring Framework来说,也应该在一个唯一的地方定义版本,并且在dependency声明中引用这一版本。这样,在升级Spring Framework的时候就只需要修改一处,实现方式见代码清单5-12。

代码清单5-12 使用Maven属性归类依赖


<project>

<modelVersion>4.0.0</modelVersion>

<groupId>com.juven.mvnbook.account</groupId>

<artifactId>account-email</artifactId>

<name>Account Email</name>

<version>1.0.0-SNAPSHOT</version>

<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>

</project>


这里简单用到了Maven属性(14.1节会详细介绍Maven属性),首先使用properties元素定义Maven属性,该例中定义了一个springframework.version子元素,其值为2.5.6。有了这个属性定义之后,Maven运行的时候会将POM中的所有的${springframework.version}替换成实际值2.5.6。也就是说,可以使用美元符号和大括弧环绕的方式引用Maven属性。然后,将所有Spring Framework依赖的版本值用这一属性引用表示。这和在Java中用常量PI替换3.14是同样的道理,不同的只是语法。