如何在Maven中处理子项目依赖项

Ice*_*ras 6 java maven-2

我的项目由5个子项目组成.一个是战争,另外四个是罐子.基本上,war项目需要所有4个jar项目及其依赖项.

我可以删除依赖项以获得类似war-> A-> B-> C-> D的内容.每个子项目都会添加它们的外部依赖项(spring,struts,hibernate),以便最终战争获得运行所需的一切.

这看起来非常有条理和方正,但后来我问自己,这是否非常实用,可以进行更改.

想象一下,我必须在项目D中更改一行代码,而不更改其Maven依赖项.我显然必须重新发布项目D,但后来我必须重新发布项目C,B,A和战争只是为了反映他们的pom文件中的这一变化.这可能很长而且很烦人,特别是如果您必须快速发布新版本以修复生产中的某些内容.

我可以让战争依赖于所有4个项目,所以我只需要在war pom文件中更改项目D版本号.但后来我有项目A间接取决于项目D 1.0和战争指定项目D 1.1.我认为战争直接依赖会赢得那种情况不会吗?

这将使新的战争版本更快,但它也会弄乱我的子项目依赖项,因为它们将过时.

处理这种情况的可行方法是什么?

Jes*_*ebb 3

您的问题没有简单的答案。

如果您确实有一系列传递依赖项(A->B->C->D),那么独立地释放链上的每个模块并不是一个坏选择。尽管这很乏味,但您的嵌套依赖项很可能是简单的 lib jar,并且不会经常看到更改。希望您不会被迫频繁地经历这个过程。假设情况与 log4j 已更新并且所有模块也需要更新一样。

另一件需要考虑的事情是 WAR 的依赖关系。是的,Maven 会自动为您提取依赖项,但显式声明已知的依赖项通常是一个好习惯,这样您就可以自己为每个模块指定版本号。这意味着 A 直接依赖于 D 和其他。不幸的是,如果您有冲突的版本号,正如您所描述的,那么您就是在类路径上寻找麻烦。如果您确实需要这样做,maven 确实允许您显式排除传递依赖项:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>my.project</groupId>
      <artifactId>module-B</artifactId>
      <version>1.0</version>
      <exclusions>
        <exclusion>
          <groupId>my.project</groupId>
          <artifactId>module-C</artifactId>
        </exclusion>
        <exclusion>
          <groupId>my.project</groupId>
          <artifactId>module-D</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>my.project</groupId>
      <artifactId>module-C</artifactId>
      <version>1.0</version>
      <exclusions>
        <exclusion>
          <groupId>my.project</groupId>
          <artifactId>module-D</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>my.project</groupId>
      <artifactId>module-D</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
  ...
</project>
Run Code Online (Sandbox Code Playgroud)

以下是描述这些可选依赖项和排除项的文档。

你真的需要独立发布B、C、D吗?如果没有,请考虑在模块根部使用聚合器pom.xml 文件。这将允许您在整个模块中使用快照版本,然后立即释放该组。这就是我们团队管理多模块项目的方式。使用 SNAPSHOT 依赖项可确保您使用在需要这些工件时刚刚构建的版本。