我有一个名为A的maven项目,它依赖于另一个名为B.jar的jar文件,A和B.jar具有相同的类但具有不同的版本。在maven构建期间,B.jar中的类总是在A中重叠。让maven只接受A中的类而不是B的方法是什么?
答案 0 :(得分:3)
我认为你对Maven模块有一个真正的概念问题。
当JAR被另一个JAR使用时,JAR不会被排除在外。
为什么在B JAR中,您是否提供了一种在运行时选择要使用的实现类的方法? 您可以通过多种方式允许它:属性,实现的接口等.... 通过这种方式,您可以指定要在客户端应用程序中使用的类 您应该考虑使用API来实现客户端类,而不是覆盖类。
这并不意味着你不能用Maven做到这一点,但它似乎错综复杂,不自然,容易出错,设计不好。
以下是使用Maven解决问题的一些想法。
您可以配置maven-jar-plugin以指定要在打包的jar中排除的类:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<excludes>
<exclude>a.b.c.MyclassToExclude.java</exclude>
</excludes>
</configuration>
</plugin>
Here是参考文档。
但通过这样做,无论如何都不会在JAR中提供课程
如果在B
中需要替换类,则会使B JAR无法单独工作。
您可以使用specific classifier打包JAR以避免此问题
您将拥有包含所有内容的经典jar和包含此着名重复类的所有内容的jar-for-a。
但实际上,我认为你应该考虑一下你的设计。