我有一个 Maven 多模块项目,它有一个父 pom 项目和一堆模块。其中一个模块是“主模块”,其中包含所有库。所有其他模块都依赖于该模块并使用提供的库。
主模块是一个 Bukkit 插件,它将其他模块作为扩展加载。这些扩展都使用自己的类加载器加载,但加载的类在加载器之间共享,以便能够相互依赖。它们还能够依赖其他 Bukkit 插件,因为它们的父类加载器是 Bukkit 的 PluginClassLoader,它还在插件之间共享加载的类以允许交互。
这就是问题开始的地方:不同的插件可能使用同一个库,但该库的类可能会被不同的类加载器加载,这会导致 LinkageErrors 和其他问题。
我解决这个问题的想法是通过 maven-shade-plugin 重新定位主模块中的库。对于仅由主模块使用的库,这可以按预期工作。但是,其他模块使用的重定位库会导致运行时 ClassNotFoundExceptions,因为模块仍然搜索正常的包名称而不是重定位的包名称。然后我尝试将导入更改为重新定位的包,但我的 IDE (IntelliJ) 找不到这些类。
有没有人知道如何解决这个搬迁问题?或者在类加载问题上可能有不同的方法?