Maven重新打包传递依赖

时间:2018-11-07 10:54:40

标签: java maven maven-3 maven-plugin maven-assembly-plugin

该应用程序由模块组成,每个模块都是具有一个父级的特定maven项目。这些模块在主应用程序中用作jar。 每个模块都通过maven使用第三方SDK。 这些SDK具有许多依赖关系,并且这些依赖关系可以具有相同的组和工件,但是具有不同的版本。很难管理它们,并且我们遇到“ NoSuchMethodError”问题。对我来说,解决问题的最简单方法是获取有问题的依赖关系的源和SDK的源,更改程序包(添加一些前缀)并导入并将其放入sdk jar中。 但是这种方法需要:为分叉的SDK的jar和私有maven仓库再增加一个git仓库,以发布它们,并且花费很多时间。 是否有可以解决此问题的Maven插件,例如可以构建jar(我们的模块jar)并包含所有依赖项但可以更改所有依赖关系包的插件?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Maven阴影插件,该插件可让您重新定位类

https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

但是我从来没有尝试过这个。

在大多数情况下,最好尝试使相关性保持一致,以便您在大多数地方使用相同的版本,并尽量减少相关性。

答案 1 :(得分:0)

恭喜,您遇到了一个称为“ jar hell”的类路径问题。我知道的唯一可以安全工作的解决方案是,对于同一类的每个版本,使用不同的类加载器(如果它不向后兼容)。

通过类的限定名称(包和类名称)以及已加载的类加载器来标识类。如果应用程序使用默认的系统类加载器,并且在类路径中的不同版本中存在相同的类,则类加载器将仅加载一个版本。在oracle JDK / JRE中,它是第一个在类路径中发生的。如果幸运的话,您可以按特殊的顺序将类路径(顺序和不依赖项)带入应用程序运行的顺序,但是我不建议您这样做,因为它非常依赖于JDK / JRE实现。

OSGI是一项可能对此有所帮助的技术,因为它提供了用于使用不同类加载器的基于模块的框架。

相关问题