我有以下场景,简化:
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等
问题:有没有办法以干净的方式实现这一点,而无需在很多地方重新声明依赖关系?
答案 0 :(得分:6)
问题是projectX需要使用projectB中定义的组件(类等)。
然后ProjetB应该是ProjectX的依赖,确实在provided
范围内。重新声明依赖项将改变Maven将其作为传递依赖项处理的方式(也就是说,您可以通过说:我希望在我的项目中使用此范围的此依赖项来覆盖其行为)。
但是在projectX中生成war时将包含projectB,我需要从生成的war中获取此库
通过在provided
范围内重新声明,不会发生这种情况。或者,您可以将ProjectA中的ProjectB范围更改为compile
,然后使用maven-war-plugin
配置inclusions/exclusions以排除它们。
在此之前,您应该仔细检查为什么在ProjectA中将语义(或需求方面)ProjectB设置为provided
,以及它对其他消费者项目的影响。
<强>更新强>
上述两种方法都可能适合您的需求。或者,正如评论中所建议的,从长远来看,进一步的选择可以更加可持续和明确,以实现更好的治理和维护(集中化):
dependencyManagement
部分更改Maven dependencies mediation处理ProjectA的传递依赖关系的方式,而不更改ProjectA或ProjectB(类似于此答案顶部的选项1,{{3}它只会在依赖项进入范围时应用,否则将被忽略)。再次集中管理,最好是在共同的父母(上面的选项)中这样做。