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

时间:2016-04-26 20:59:27

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

我有以下场景,简化:

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中的范围以使用compile用于projectB,一切都会起作用,但是在projectX中生成war时将包含projectB,并且我需要将这个库从生成的war中取出,因为我是在项目的其他部分提供projectB。

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

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

1 个答案:

答案 0 :(得分:6)

  

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

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

  

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

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

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

  • 使用公共parent pom,您可以在其中声明共享依赖项列表,即所有子项目将使用的依赖项,定义(和维护)一次。
  • 使用ProjectX中的dependencyManagement部分更改Maven dependencies mediation处理ProjectA的传递依赖关系的方式,而不更改ProjectA或ProjectB(类似于此答案顶部的选项1,{{3}它只会在依赖项进入范围时应用,否则将被忽略)。再次集中管理,最好是在共同的父母(上面的选项)中这样做。