【问题标题】:How can I use dependencies of a project that's been marked as provided?如何使用标记为已提供的项目的依赖项?
【发布时间】:2016-08-20 21:56:07
【问题描述】:

我有以下场景,简化:

projectX  ---> projectA ---> projectB

---> 的意思是“取决于”。

ProjectB 非常简单。它没有声明任何依赖项。事实上,唯一相关的部分是:

<packaging>jar</packaging>

在 projectA 的 pom.xml 中,我声明了对 projectB 的依赖:

<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectB</artifactId>
        <version>1.0.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

在 projectX 的 pom.xml 中我有:

<packaging>war</packaging>
<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectA</artifactId>
        <version>1.0.0</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

问题在于 projectX 需要使用在 projectB 中定义的组件(类等)。如果我将 projectA 中的范围更改为对 projectB 使用compile,一切都会正常工作,但是在 projectX 中生成战争时将包含 projectB,并且我需要将这个库从生成的战争中删除,因为我正在提供 projectB在项目的其他部分。

在实际场景中,我有几个像 projectB 这样影响 projectA 的依赖项,所以为了减少生成的战争的大小,我想将它们设置为提供,但是 projectX 无法使用任何这些库中定义的组件.组件示例:Spring、Hibernate 等

问题:有没有办法以干净的方式实现这一点,而无需在很多地方重新声明依赖关系?

【问题讨论】:

  • 提供的依赖不是传递的stackoverflow.com/questions/34904558/…。它以这种方式构建到 Maven 中,并且可能永远不会改变。
  • @Tunaki 这就是这个问题的动机(:
  • 是的,但这就是这里的结论:使用您未声明的依赖项是错误的。 请参阅我的答案,有一个错误报告。您必须明确声明它。
  • @Tunaki 我的问题是:如何避免在多个项目中一遍又一遍地重新声明多个依赖项?有几个,我的意思是超过 10 个依赖项。
  • 或者,考虑制作一个您在每个项目中导入的 BOM(如果您不能像 @A.DiMatteo 建议的那样制作父 POM)? Like here 和 doc here。这可以解决您的问题。

标签: java maven maven-3 pom.xml maven-dependency


【解决方案1】:

问题在于 projectX 需要使用在 projectB 中定义的组件(类等)。

那么 ProjetB 应该是 ProjectX 的依赖项,在 provided 范围内,再次。重新声明依赖项会改变 Maven 将其作为传递依赖项处理的方式(也就是说,您可以通过说:我希望在我的项目中具有此范围的此依赖项来覆盖其行为)。

但是在projectX中生成war时会包含projectB,我需要把这个库从生成的war中取出来

在provided 范围内重新声明它不会发生这种情况。或者,您可以将 ProjectA 中 ProjectB 的范围更改为 compile,然后使用 inclusions/exclusions 配置 maven-war-plugin 以排除它们。
不过,在这样做之前,您应该仔细检查为什么在 ProjectA 中将 ProjectB 在语义(或需求方面)设置为 provided,以及它对其他消费者项目的影响。


更新
上述两种方法都可能适合您的需求。或者,正如 cmets 中所建议的那样,从长远来看,进一步的选择可能更可持续、更清晰,以实现更好的治理和维护(集中化):

  • 使用通用parent pom,您可以在其中声明共享依赖项列表,即所有子项目将使用的依赖项,定义(和维护)一次。
  • 使用 ProjectX 中的 dependencyManagement 部分更改 Maven dependencies mediation 如何处理对 ProjectA 的传递依赖项,而不更改 ProjectA 或 ProjectB(类似于此答案顶部的选项 1,the difference 只会每当依赖项进入范围时应用,否则忽略)。同样,要集中管理这种管理,最好是在一个共同的父级中这样做(上面的选项)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2013-11-07
    • 2016-03-05
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多