2010-09-07 154 views
6

我的项目由5个子项目组成。一个是战争,另外四个是罐子。基本上战争项目需要全部4个jar项目和它们的依赖项。如何处理Maven中的子项目依赖关系

我可以剥夺依赖关系,使其具有诸如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。我认为战争直接依赖会在这种情况下赢得胜利吗?

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

什么是可以接受的方式来处理这种情况?

回答

3

有没有简单的答案,你的问题。

如果你确实有一个传递依赖链(A-> B-> C-> D),那么将每个模块独立地释放到链上并不是一个坏的选择。很好的机会,你的嵌套依赖是简单的lib jar,并且不会经常看到更改,希望你不会经常被迫经历这个过程。假设它和log4j被更新并且你所有的modu完全一样还需要更新。

需要考虑的另一件事是WAR的依赖关系。是的,Maven会自动为你提供依赖关系,但是明确声明你已知的依赖关系通常是一个好习惯,所以你可以为每个模块自己指定一个版本号。这意味着A直接取决于D和其他人。不幸的是,如果你有版本号冲突,正如你所描述的那样,那么你正在寻找类路径上的麻烦。如果你真的需要,虽然做到这一点,行家也让你排除传递依赖明确:

<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> 

这里是documentation描述这些可选依赖和排除。

你真的需要独立释放B,C和D吗?如果不是,请考虑在模块的根目录下使用Aggregator pom.xml文件。这将允许您在整个模块中使用SNAPSHOT版本,然后立即释放一堆。这是我们团队管理我们的多模块项目的方式。使用SNAPSHOT依赖性可确保您使用在需要这些工件时JUST构建的版本。

+0

嗨Gweebz。感谢您的详细回复。我不需要单独发布每个子项目,所以我会仔细看看这个我不知道的聚合器概念。这些模块包含所有业务和数据代码,并且必然会定期更改。另一个解决方案是按照你所说的排除传递依赖关系,我没有想到这一点。感谢您对此的关注。 – IceGras 2010-09-07 15:31:46

+0

由于不需要独立发布每个模块,我强烈建议使用Aggregator解决方案。它的图案非常适合您的场景。很高兴我能帮上忙 :) – 2010-09-07 15:37:18

1

实际上你是否独立发布任何项目A到D,没有WAR?如果没有,我没有看到您当前的设置有任何问题。你应该绝对在整个项目中使用相同版本的任何模块。否则,你开门的类加载器地狱 - 相信我,你不想去那里:-(

为了使发行更加容易,在maven-release-plugin可以帮助你

+0

HiPéter。项目A到D是特定于WAR的,但我必须单独发布它们,以便其他开发人员可以构建WAR,Maven发行版插件可以找到依赖关系。也许这些版本不是必需的? – IceGras 2010-09-07 15:13:34

+0

@IGGras,每次改变版本号时都会碰到版本号,这可能确实是矫枉过正。在我们的项目中,我们对开发期间的SNAPSHOT版本感到满意,并且我们为官方发布(候选)创建了一个新的具体版本。 – 2010-09-07 15:35:54

+0

在开发期间使用快照看起来确实是最好的解决方案,但是后来我有这个问题:如果在版本1.0中使用所有模块释放RC1,并且只需更改模块C.如果释放RC2,所有其他项目都会增加没有什么版本呢?另外我最担心的是生产变化。如果我的版本需要更改,我将不得不通过所有版本号来传递更改。 – IceGras 2010-09-07 15:51:06

1

现在最好的答案是使用Gradle,这是最好的蚂蚁和maven。我从来没有真正喜欢过maven,但是gradle使用了很多共同的概念,但是它更像蚂蚁,因为它很灵活,所以在gradle中没有简单的回答你的问题;)。