Maven可以用来管理那些简单的单模块系统,或者复杂到拥有数百个相互关联的子模块的项目。学习Maven过程的有一部分不仅仅是弄清楚Maven配置的语法,而是学习“Maven方式”——一组使用Maven组织和构建项目的最佳实践。本节试图展现一些这样的知识来帮助你采用最佳实践,你就不用从头开始去Maven的邮件列表的数年的内容中寻找这些技巧。
如果你有一组逻辑上归类在一起的依赖。你可以创建一个打包方式为pom项目来将这些依赖归在一起。例如,让我们假设你的应用程序使用Hibernate,一种流行的对象关系映射框架。所有使用Hibernate的项目可能同时依赖于Spring
Framework和MySQL
JDBC驱动。你可以创建一个特殊的POM,它除了声明一组通用依赖之外什么也不做。这样你就不需要在每个使用Hibernate,Spring和MySQL的项目中包含所有这些依赖。你可以创建一个项目叫做persistence-deps(持久化依赖的简称),然后让每个需要持久化的项目依赖于这个提供便利的项目。
Example 9.13. 在一个单独的POM项目中巩固依赖
<project>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>persistence-deps</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>${hibernateVersion}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>${hibernateAnnotationsVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hibernate3</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysqlVersion}</version>
</dependency>
</dependencies>
<properties>
<mysqlVersion>(5.1,)</mysqlVersion>
<springVersion>(2.0.6,)</springVersion>
<hibernateVersion>3.2.5.ga</hibernateVersion>
<hibernateAnnotationsVersion>3.3.0.ga</hibernateAnnotationsVersion>
</properties>
</project>
如果你在一个名为persistence-deps的目录下创建了这个项目,你需要做的只是创建该pom.xml并且运行mvn
install。由于打包类型是pom,这个POM被安装到你的本地仓库。你现在就可以添加这个项目作为一个依赖,所有该项目的依赖就会被添加到你的项目中。当我们声明一个对于persistence-deps项目的依赖的时候,不要忘了指定依赖类型为pom。
Example 9.14. 声明一个对于POM的依赖
<project>
<description>This is a project requiring JDBC</description>
...
<dependencies>
...
<dependency>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>persistence-deps</artifactId>
<version>1.0</version>
<type>pom</type>
</dependency>
</dependencies>
</project>
如果之后你决定切换一个不同的JDBC驱动(比如,JTDS),只要替换persistence-deps项目中的依赖,使用sourceforge.jtds:jtds而不再是mysql:mysql-java-connector,然后更新版本号。所有依赖于persistence-deps的项目,如果它们决定更新一个新的依赖版本,就会使用JTDS。巩固相互关联的依赖是一种减少pom.xml文件长度的很好的方法。如果你需要在项目间共享一组很多的依赖,你也可以建立在项目间建立父子关系,然后将所有共同的依赖重构到父项目中,但是这种父子方式的缺点是一个项目只能有一个父项目。有时候将类似的依赖归类在一起并且使用pom依赖是更明智的做法。因为这样你的项目就可以根据需要引用很多巩固依赖POM。
Note
当Maven使用一种“最近者胜出”方式解决依赖的时候,它会用到依赖的深度。当使用上述提到的依赖归类技术的时候,会把依赖推入整个树的更深一层。当在选择用pom归类依赖或者用父POM的dependenctManagement的时候,需要留意这一点。

