优化POM的步骤
1.依赖上移
多个子module中共用同一个dependency,可抽取到父POM中。例:一些依赖如spring和hibernate-annotations在多个模块中被声明。每个hibernate依赖都重复排除了javax.transaction。在这些依赖配置被上移之后,我们需要为每个POM移除这些依赖的版本,否则它们会覆盖定义在父项目中的dependencyManagement
父POM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.3.0.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.3.0.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
子POM:
<project>
...
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
</dependency>
</dependencies>
...
</project>
如果多于一个项目依赖于一个特定的依赖,你可以在dependencyManagement中列出这个依赖。父POM包含一个版本和一组排除配置,所有的子POM需要使用groupId和artifactId引用这个依赖。如果依赖已经在dependencyManagement中列出,子项目可以忽略版本和排除配置。
2.版本重复修复
有一些依赖是关联的,共享同样的版本。这种情况通常是因为某个项目的发布版本中包含了多个紧密关联的组件。例如,看一下依赖hibernate-annotations和hibernatecommons-
annotations,两者的版本都是3.3.0.ga,而且我们可以预料这两个依赖的版本只会一起向前改变。hibernate-annotations和hibernate-commons-annotations都是JBoss发布的同一个项目的组件,当有新的版本发布的时候,两个依赖都会改变。
父POM:
<project>
...
<properties>
<hibernate.annotations.version>3.3.0.ga</hibernate.annotations.version>
</properties>
<dependencyManagement>
...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>${hibernate.annotations.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>${hibernate.annotations.version}</version>
</dependency>
...
</dependencyManagement>
...
</project>
3.兄弟模块依赖和兄弟模块版本的重复(可归类到上述1和2)
4.优化插件
在顶层POM中使用dependencyManagement片段管理依赖