1 .使用项目继承

 利用项目继承可以将结构信息,部署信息,共同的依赖信息放置在单一的位置。在每个工程的 pom 中:

 

  1. <parent> 
  2.  
  3. <groupId>org.apache.maven.proficio</groupId> 
  4.  
  5. <artifactId>proficio</artifactId> 
  6.  
  7. <version>1.0-SNAPSHOT</version> 
  8.  
  9. </parent> 

这使得项目的 pom 可以继承顶层 pom 中的定义,检查顶层 pom 的 dependencies 部分:

  1. <project> 
  2.  
  3. <dependencies > 
  4.  
  5. <dependency > 
  6.  
  7. <groupId>junit</groupId> 
  8.  
  9. <artifactId>junit</artifactId> 
  10.  
  11. <version>4.7</version> 
  12.  
  13. <scope>test</scope> 
  14.  
  15. </dependency > 
  16.  
  17. </dependencies > 
  18.  
  19. </project> 

在各个子模块的 pom 中没有对 Junit 依赖的定义,但是从顶层 pom 中继承了依赖的定义。

 

为了看清楚可以在一个子模块 pom 所在目录下,执行命令

  1. #mvn help:effective-pom 

可以看到最终起效果的 pom ,这在找错时很有效。

 

2 .管理依赖

 

在 pom 中指明 dependency management 元素的方式 maven 结合项目继承来管理依赖。在多模块应用中,可能多个子项目会有共同的依赖。此时为了正确运行,必须让所有的子项目使用依赖项的同一版本。必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的成果。因此,应在顶层的 pom 中定义共同的依赖关系。

 

在 Proficio 应用的顶层 pom 中的 dependency management 段如下:

  1. <dependencyManagement> 
  2.  
  3.     <dependencies > 
  4.  
  5.       <dependency > 
  6.  
  7.         <groupId>com.devzuz.mvnbook.proficio</groupId> 
  8.  
  9.         <artifactId>proficio-model</artifactId> 
  10.  
  11.         <c>${project.version}</version> 
  12.  
  13.       </dependency > 
  14.  
  15.       <dependency > 
  16.  
  17.         <groupId>com.devzuz.mvnbook.proficio</groupId> 
  18.  
  19.         <artifactId>proficio-api</artifactId> 
  20.  
  21.         <version>${project.version}</version> 
  22.  
  23.       </dependency > 
  24.  
  25.       <dependency > 
  26.  
  27.         <groupId>com.devzuz.mvnbook.proficio</groupId> 
  28.  
  29.         <artifactId>proficio-core</artifactId> 
  30.  
  31.          <version>${project.version}</version> 
  32.  
  33.       </dependency > 
  34.  
  35.       <dependency > 
  36.  
  37.         <groupId>com.devzuz.mvnbook.proficio</groupId> 
  38.  
  39.         <artifactId>proficio-store-memory</artifactId> 
  40.  
  41.         <version>${project.version}</version> 
  42.  
  43.       </dependency > 
  44.  
  45.       <dependency > 
  46.  
  47.         <groupId>com.devzuz.mvnbook.proficio</groupId> 
  48.  
  49.         <artifactId>proficio-store-xstream</artifactId> 
  50.  
  51.         <version>${project.version}</version> 
  52.  
  53.       </dependency > 
  54.  
  55.       <dependency > 
  56.  
  57.         <groupId>org.codehaus.plexus</groupId> 
  58.  
  59.         <artifactId>plexus-container-default</artifactId> 
  60.  
  61.         <version>1.0-alpha-9</version> 
  62.  
  63.       </dependency > 
  64.  
  65.     </dependencies > 
  66.  
  67.   </dependencyManagement> 

注意 ${project.version} 变量指的是应用的 version 。

 

顶层 pom 中的 dependencies 与 dependencyManagement 中的 dependencies 元素有一个重要的区别:

 

dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项;而 dependencies 元素则影响项目的依赖项。

 

检查 Proficio api 模块的 pom:

  1. <project> 
  2.  
  3.   <parent> 
  4.  
  5.     <groupId>com.devzuz.mvnbook.proficio</groupId> 
  6.  
  7.     <artifactId>proficio</artifactId> 
  8.  
  9.     <version>1.0-SNAPSHOT</version> 
  10.  
  11.   </parent> 
  12.  
  13.   <modelVersion>4.0.0</modelVersion> 
  14.  
  15.   <artifactId>proficio-api</artifactId> 
  16.  
  17.   <packaging>jar</packaging> 
  18.  
  19.   <name>Proficio API</name> 
  20.  
  21.   <dependencies > 
  22.  
  23.     <dependency > 
  24.  
  25.       <groupId>com.devzuz.mvnbook.proficio</groupId> 
  26.  
  27.        <artifactId>proficio-model</artifactId> 
  28.  
  29.     </dependency > 
  30.  
  31.   </dependencies > 
  32.  
  33. </project> 

 其中没有指明依赖项的版本信息,在顶层 pom 中的 dependencyManagement 中表明其优选的版本是 ${project.version} 即 1.0-SNAPSHOT 。为使其模块 pom 完整,其版本信息会注入其中。

 

只有当 外层的dependencies 元素中没有指明版本信息时, dependencyManagement 中的 dependencies 元素才起作用。

 

注意:一个是项目依赖,一个是多模块maven项目时候的依赖管理控制的。