2017-05-26 78 views
0

我正在研究一个Java monolith将其分成几个可重用的模块。Maven JAR模块在发布中包含依赖项?

我开始弄清楚依赖关系树可能存在一些问题。

解释我的问题,让我们想象一个简单的项目,其中包括4只依赖:

Proj 
    ProjA 
    ProjB 
    ProjC 
    ProjD 

想象一下,我主要依赖项目之一 - ProjA - 需要主要依赖项目之一 - ProjD-。

ProjA 
    ProjD 
    ProjF 

防止类路径和其他依赖性问题中重复类的最佳做法是什么?

是否应该在JAR模块中包含依赖关系,并尝试通过设计将它们降至最低?在这种情况下,重写我的子模块以避免发生这种情况。

或者你应该构建没有依赖关系的JAR模块,并且只将它们包含在父“root”项目中?

+0

我不明白你想达到什么。你在建造一个罐子还是一场战争?为什么你想重复类?多模块项目可以具有从一个模块到另一个模块的依赖关系(在pom.xml中) –

+0

每个子模块应该表示与som相关的功能,或者可能表示应用程序中的一个图层。例如,ProjA是持久层,所以ProjB,ProjC和ProjD依赖于ProjA。所以可以有依赖关系,但不是循环依赖关系。一旦模块被设置,maven应该抱怨如果有人试图引入循环依赖。如果有一个明确定义的包结构,那么不应该在同一个包**中重复类名**。不同软件包中重复的类名称会导致代码重复和/或类名不灵。 –

+0

这不是关于循环依赖。只是重复的类依赖关系。设想2个依赖关系,包括作为Hibernate的潜在不同版本的依赖项。你如何解决这个问题? – user3779543

回答

0

循环:

是否有依赖关系树的Maven周期将凸显。如果您看到周期,则必须重构模块。

建造顺序:

Maven将决定考虑哪种模块所有模块的构建顺序依赖的其他模块。因此,您在父pom中指定的模块顺序无关紧要。

Comman第三方库:

如果您有不同模块之间共享的任何第三方的依赖,最好的办法就是保持父项目的POM这种依赖性。

+0

根据我的理解,这就是如果你的模块没有跨越多个项目。如果您的模块由多个项目共享,则它将成为标准依赖项。如果这个依赖关系具有与其他模块冲突的依赖关系(第三方或不)?你把它们包含在JAR中吗? – user3779543

+0

是的。您应该将它们包含在模块中,因为您希望您的模块可以使用。当你的模块被其他项目使用时,他们应该注意是否接受模块的传递依赖关系。我们遵循这个规则来处理任何第三方开放源代码框架,其中图书馆碰撞的可能性较高。 – Shinchan

+0

我尊重标准,但在我的情况下这是非常烦人的。大多数模块和项目都有标准的apache.commons和/或hibernate和/或jackson依赖。这意味着他们不能按照这个标准共享。建立一个没有依赖关系的JAR和一个包含所有依赖关系的“über-JAR”是否可行,并根据项目导入的情况包含最有利的JAR? – user3779543

相关问题