我有一个包含多个模块(B),(C),(D)的项目(A)。模块B取决于C,而模块C取决于D。
模块D具有外部依赖性,例如
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
模块D构建良好。
如上所述,模块C依赖于模块D,并且该构建开始抱怨slf4j-api类与模块D中的类重叠。
[WARNING] slf4j-api-1.7.26.jar, module-d-0.1.0.jar define 34 overlapping classes:
[WARNING] - org.slf4j.helpers.SubstituteLogger
[WARNING] - org.slf4j.helpers.NamedLoggerBase
...
我不太了解这里发生了什么。 slf4j-api-1.7.26.jar被拉入C,因为它是D的列出依赖项,但是D已经拥有它,那么为什么还要尝试再次将其拉入?
好的,所以我经历了从D的阴影插件中排除slf4j的麻烦
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
<artifactSet>
<excludes>org.slf4j:*</excludes>
</artifactSet>
</configuration>
,这可以暂时解决问题。它不包含在D中,因此当我构建C时,没有关于重复的警告。但是当我去构建依赖于C的B时,突然出现了重叠的类警告,因为C打包了slf4j-即使它没有明确的依赖。
我不想从堆栈的每个模块中排除依赖项-似乎应该足够聪明,知道它已经被提供了(不要尝试再次打包),或者没有提供(在这种情况下,只需提供一次即可)。
感觉我只是在配置一些错误,但是我还没有找到一个好的答案。