我的项目由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.我认为战争直接依赖会赢得那种情况不会吗?
这将使新的战争版本更快,但它也会弄乱我的子项目依赖项,因为它们将过时.
处理这种情况的可行方法是什么?
您的问题没有简单的答案。
如果您确实有一系列传递依赖项(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 依赖项可确保您使用在需要这些工件时刚刚构建的版本。