【问题标题】:How should I share Maven DepdendencyManagement from multiple sources?我应该如何从多个来源共享 Maven 依赖管理?
【发布时间】:2011-11-27 05:50:56
【问题描述】:

我有一个 Maven 项目多模块项目。一些模块为其他模块生成的库创建自定义打包。正在使用的包装有自己的一套版本化依赖项,我需要很好地使用它们。

例如:我的父 POM 可能有一个条目,例如commons-codec:commons-codec 1.4,我的“core-lib”POM 包含它作为依赖项(无显式版本),我想确保我的打包模块捆绑在正确的版本中。但是,我使用的特定类型的自定义包装也需要,例如log4j:log4j 1.2.15,我想确保当我的打包模块运行时,它还捆绑了正确的 log4j 版本。

这就是问题所在:我正在为“制作 {custom packaging} 的项目”工作的示例 POM 使用了自定义包装团队提供的父级。如果我使用他们的父母,我会丢失commons-codec 的版本信息。如果我使用我的父母,我会丢失 log4j 的版本信息。

现在,通常如果我问“如何使 A 和 B 依赖于相同的版本”,您会回答“使 A 和 B 具有相同的父级,并在父级中包含 dependencyManagementsection”。我的问题是,我需要 A、B 和 C 依赖同一个版本,但我对 C 没有任何控制权。

认为这就是 Maven 的“mixins”要解决的问题,但当然它们还不存在。与此同时,我一直在做的是选择一个父母,然后从另一个 POM 复制并粘贴 dependencyManagement 部分,并附上一条评论说“确保你保持最新”。显然这是一个丑陋、丑陋的 hack,但我还没有找到另一种与双方保持同步的方法。

【问题讨论】:

    标签: maven multiple-inheritance dependency-management multi-module


    【解决方案1】:

    使用assembly plugin 打包您的工件及其所有依赖项并让您的打包模块在其上运行怎么样?那么你就没有尝试任何 pom 魔法。这只是一个项目使用另一个项目的工件的问题,就像往常一样。

    【讨论】:

    • 你的意思是,A 是库,B 从库中生成一个 jar-with-deps,然后 C 从 B 中解压工件,并将其重新打包到我们的自定义包装中?可能只是疯狂到可以工作;我会调查的
    • 我想到了一个想法:假设 A(库)与 C(自定义打包/运行时)共享依赖项——也许我在我的业务逻辑中使用 log4j,他们在他们的守护进程中使用它包装或你有什么。我们不能用你的方法包括两个版本吗?
    • 1) 您不需要单独的 B 来制作 jar-with-deps。只需在 A 中配置程序集插件即可。 2)如果 A 和 C 存在依赖冲突而 C 无法处理,那么您似乎应该使用更好的守护程序。出于这个确切原因,您的包装器/容器的类路径应该与您的应用程序的类路径完全分开。即,我不认为这是要在您的 POM 中解决的问题。
    【解决方案2】:

    现在,我将接受“这是关于 Maven 的真正糟糕的事情之一”的答案。也许这个问题可以在 Maven 3.1 最终发布时得到更新。

    【讨论】:

      【解决方案3】:

      您是否不能激活多个配置文件,这些配置文件在启用时具有自己的依赖项部分拉入所需的库。由于可以激活配置文件的方式,这提供了一些很好的灵活性。

      【讨论】:

      • 我认为个人资料与此无关。假设我有两个项目(称它们为“A”和“B”),并且我希望它们都使用 AwesomeLogger v1.2.3。但是,它们中的每一个都需要打包在 MySuperContainer 中。现在,假设创建 MySuperContainer 包的最简单方法是将“MSC”父 POM 设为项目的父级。如果我这样做,就无法在在某个 POM 文件中的某处声明 A 和 B 都说“使用 AwesomeLogger 1.2.3”。
      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2012-10-03
      • 2011-06-24
      • 2021-12-08
      相关资源
      最近更新 更多