管理项目依赖项的最佳方法是什么

时间:2016-07-24 02:35:35

标签: java maven maven-dependency-plugin

我在服务中有以下依赖关系层次结构:

Service A
   -> Lib A
   -> Lib B
      -> Lib A
   -> Lib C
      -> Lib A
    -> Lib D
      -> Lib A

“ - >” 中意思取决于。

由于上述结构,出现了很多问题。需要付出大部分努力的是在所有模块中保持 Lib A同步,以避免类冲突和其他问题。

我正在使用maven进行依赖关系管理但它没有解决问题,因为我必须更新所有依赖项以避免冲突(语义和功能)

有没有更好的方法来管理这些依赖项?

编辑1:

场景1 :向Lib A添加新代码,该代码仅供Lib B使用。

在这种情况下,更改Lib B是不够的。我将不得不在服务A中添加最新版本的Lib A,以便maven选择正确的版本。

场景2 :A。

中的非向​​后兼容更改

如果我只更新服务A中的Lib A,这将导致问题,因为其他lib(B,C和D)不知道这个新的更改并且它可能会中断(例如在现有方法方法中添加新参数) 。我将不得不更新所有这些。

场景3 :更改Lib A中的现有方法。

这样可以正常工作。如果我在服务A中更新此Lib A,maven将获取最新的Lib A,并且所有库(B,C和D)将使用最新版本的Lib A.

4 个答案:

答案 0 :(得分:1)

不确定我是否理解正确的问题,你是否提到了库之间的依赖冲突。

如果您在库之间具有相同的依赖关系,那么将其排序的一种方法可能是使用排除项,这样您就可以添加一个依赖项并排除其他项(https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

答案 1 :(得分:0)

您可能会查看OSGi或Java 9模块(当然还没有完成)。我不是专家,但我相信这些框架允许模块/包的概念,其中每个模块都有自己的类加载器。这意味着如果lib B和lib C是模块,它们可以有不同版本的lib A,一切都会顺利进行。它确实阻止了lib B和lib C直接通信,但是给出了你想要的依赖树。

- 更新以匹配您的更新 -

情景1:

更新lib仅在模块B中的版本。模块C / D可以保持不变。

情景2:

当每个模块准备好使用新版本的lib A时,您可以单独更新模块B / C / D中的库A.

情景3:

没问题。

答案 2 :(得分:0)

考虑域驱动设计,更具体地说,有界上下文模式。它允许代码重复到一定程度。灵活性将允许您解耦" jar A"其余的很容易。

有界上下文究竟是什么?

让我们想象一下,我们有用户。此用户在一个上下文中可以是 UserAdmin ,或者在另一个上下文中可以是 PowerUser ,或者在另一个上下文中可以只是用户

现在让我们拥有3个服务的映像,这些服务基于hist类型解决用户的三个不同功能。每个服务代表用户一词的不同上下文。现在的重点是,而不是创造一个全能的用户"在你的情况下,它将进入全能的" libA"我们将根据上下文创建3个用户,并为这3个用户提供不同的功能。最终我们将最终得到3个域对象AdminUser用于服务1 PowerUser用于服务2而仅用户用于服务3.这三个服务将不会彼此依赖,除非它适合我们,即使他们拥有它将是小菜一碟在任何时候将它们分开。

如果我们开始将服务视为洋葱。在第一层我们会有持久性。在第二层,我们将开始展开我们的域模型。在下一层,我们将开始构建我们的服务。然后我们的网络表示等等。

根据 Bounded Context 进行思考将允许您基于每个服务创建唯一的Bounded上下文,这将允许您在不同的Jars之间不具有这种相互依赖性。这是因为您的服务不一定与其他服务共享代码。

答案 3 :(得分:0)

Service A
   -> Project Commons
       -> Lib B_A (functional dependency, commons B no functional dependency with C and D)
       -> Lib C_A (functional dependency, commons C no functional dependency with B and D)
       -> Lib D_A (functional dependency, commons C no functional dependency with B and C)
       -> Lib A (technical dependencies , commons in B C D)
       -> pom_parent
   -> Lib B
      -> Lib A and Lib B_A
   -> Lib C
      -> Lib A and Lib C_A
    -> Lib D
      -> Lib A and Lib D_A
pom_parent (SNAPSHOT)