Maven依赖关系库层次结构的问题

时间:2018-02-22 10:18:16

标签: java maven

我打算让自己打结,让Maven处理我的应用程序中模块之间的依赖关系,并且我想知道什么是最好的练习方式。

我有一组库用于我的所有应用程序,如下所示:

<shared-code>
  |---- common-lib
  |---- REST-lib
  |---- WebApp-lib
  |---- REST-Pom
  \---- WebApp-Pom

实际上有更多的人工制品,但重要的是:

  • 我存储所有通用代码时的common-lib
  • REST-lib和WebApp-lib是更依赖于common-lib的专业库
  • REST-Pom和WebApp-Pom是针对不同类型应用程序的父POM,关键是,它们依赖于REST-lib或WebApp-lib
  • 所有5件文物一起发布,并且总是具有相同的版本。

当我来写我的应用程序时,我得到了:

<application-code>
  |---- parent-pom
  |---- module-1
  |---- module-2
  \---- module-3
  • parent-pom扩展REST-Pom或WebApp-Pom并添加项目特定信息(例如SCM信息)
  • module-1,module-2,module-3都扩展了parent-pom
  • 与此同时,所有的文物都与普通版本一起发布,但(严格地说)不同于。

根据my previous question的建议,我一直在定义表单中的依赖项:

<dependency>
    <artifactId>common-lib</artifactId>
    <groupId>${project.groupId}</groupId>
    <version>${project.parent.version}</version>
</dependency>

我喜欢这个,因为当我为所有版本设置版本时,我不必浏览每个POM。

问题在于${project.parent.version}是针对每个POM单独评估的,并且不会总是评估相同的事情。

  • parent-pom将$ {project.parent.version}计算为REST-Pom或WebApp-Pom的版本,该版本与common-lib处于锁定状态,因此我们获得了正确的值。 / LI>
  • module-1,module-2和module-3将$ {project.parent.version}计算为parent-pom的版本,这是不同的。

我认为我需要的是一个表达式,我可以将其用作说明&#34;该项目的版本的版本,而不是扩展它的东西&#34;

1 个答案:

答案 0 :(得分:1)

家长poms 旨在保持孩子们包含的依赖关系(<dependencies>)或按需提供(<dependencyManagement>)。
在父pom的dependencyManagement元素中定义它们:

<dependencyManagement>
   <dependencies>
     <dependency>
        <artifactId>common-lib</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.parent.version}</version>
     </dependency>
      <!-- and so for -->
   </dependencies>
</dependencyManagement>

让孩子们的项目在他们自己的pom中引用它们:

<dependencies>
  <dependency>
    <artifactId>common-lib</artifactId>
    <groupId>${project.groupId}</groupId>
  </dependency>
  <!-- and so for -->
</dependencies>

你可以注意到,依赖版本并不需要,不应该由孩子设置,因为它是由父pom定义的。