如何使用已标记为已提供的项目的依赖项?

Lui*_*oza 7 java pom.xml maven-3 maven maven-dependency

我有以下场景,简化:

projectX  ---> projectA ---> projectB
Run Code Online (Sandbox Code Playgroud)

--->指"依赖".

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

<packaging>jar</packaging>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

问题是projectX需要使用projectB中定义的组件(类等).如果我将projectA中的范围更改compile为用于projectB,那么一切都会起作用,但是在projectX中生成war时将包含projectB,并且我需要将这个库从生成的war中取出,因为我在其他部分提供了projectB该项目.

在真实场景中,我有几个依赖项,比如projectB,它们会影响projectA,所以为了减少生成的war的大小,我想按照提供的方式设置它们,但是projectX不能使用任何这些库中定义的组件.组件示例:Spring,Hibernate等

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

A_D*_*teo 6

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

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

但是在projectX中生成war时将包含projectB,我需要从生成的war中获取此库

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


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

  • 使用公共父pom,您可以在其中声明共享依赖项列表,即所有子项目将使用的依赖项,定义(和维护)一次.
  • 使用dependencyManagementProjectX中的部分更改Maven依赖关系中介如何处理ProjectA的传递依赖关系,而不更改ProjectA或ProjectB(类似于此答案顶部的选项1,区别在于只有在依赖关系进入范围时才会应用它并忽略了.再次集中管理,最好是在共同的父母(上面的选项)中这样做.