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
的时候,需要留意这一点。