从 Maven 中的依赖项中排除类

2022-09-04 21:16:48

我有一个项目,它依赖于由供应商控制的工件。此工件包含一些我所依赖的类,以及一些较旧的类并导致问题。有没有办法让 maven 自动扩展 jar、删除类,并将它们重新打包为依赖项?我试着举个例子。

supplier:artifact:1.0.0
com.supplier.useful.ClassA
com.supplier.dto.ClassB (old)

us:dependency:1.1.20
com.supplier.dto.ClassB (new)

us:project-web:1.1.20
- supplier:artifact:1.0.0
- us:dependency:1.1.20

所以 - 我需要在项目web中使用,但我需要使用来自工件的。我无法修改 supplier:artifact 或 us:dependency。ClassAClassBdependency

有什么想法吗?!


答案 1

由于版本 2.0.9 maven 保留了类路径排序,因此,如果您在供应商 jar 之前的 jar 中定义修补的类,它将隐藏供应商实现。

或者,您可以查看maven shade插件,因为它完全符合我的要求。


答案 2

如果您使用的是 Maven 2.0.9+,则只需将类放入 jar 中,并在供应商的工件之前将其声明为依赖项即可。正如@Peter中提到的,Maven 从 Maven 2.0.9 开始对类路径使用 pom 顺序(参见 MNG-1412 / MNG-3111)。

如果出于某种原因,您对此解决方案不满意,则可以使用 Maven Dependency 插件来解压缩依赖项(应该在编译类路径上),使用 dependency:unpack 和一些排除(请参阅解压缩特定工件)。我甚至不会尝试重新打包它,这将引入无用的复杂性(如果可行,用编译类路径上的新jar替换旧jar不会是微不足道的)。target/classes


推荐