9.6. POM最佳实践

Maven可以用来管理那些简单的单模块系统,或者复杂到拥有数百个相互关联的子模块的项目。学习Maven过程的有一部分不仅仅是弄清楚Maven配置的语法,而是学习“Maven方式”——一组使用Maven组织和构建项目的最佳实践。本节试图展现一些这样的知识来帮助你采用最佳实践,你就不用从头开始去Maven的邮件列表的数年的内容中寻找这些技巧。

9.6.1. 依赖归类

如果你有一组逻辑上归类在一起的依赖。你可以创建一个打包方式为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归类依赖或者用父POMdependenctManagement的时候,需要留意这一点。