7

我有以下场景,简化:

projectX  ---> projectA ---> projectB

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

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 中的范围更改为compile用于 projectB,一切都会正常工作,但是在 projectX 中生成战争时将包含 projectB,并且我需要将这个库从生成的战争中移除,因为我在其他部分提供了 projectB的项目。

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

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

4

1 回答 1

6

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

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

但是在projectX中生成战争时会包含projectB,我需要将这个库从生成的战争中取出

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


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

  • 使用一个公共父 pom,您可以在其中声明共享依赖项列表,即所有子项目将使用的依赖项,定义(和维护)一次。
  • 使用dependencyManagementProjectX 中的部分来更改Maven 依赖项调解如何处理 ProjectA 上的传递依赖项,而不更改 ProjectA 或 ProjectB (类似于此答案顶部的选项 1,不同之处在于它仅在依赖项进入范围时应用否则忽略)。再次集中管理这种管理,最好是在一个共同的父母中这样做(上面的选项)。
于 2016-04-26T21:10:21.280 回答