Java 如何使用一个库的多个版本可能使用类加载器

Java how to use multiple versions of one library maybe using classloaders

我正在开发一个 java 插件(用于 BungeeCord),它使用 Guava 28.2 的方法。但是实际加载我的插件的程序 BungeeCord 只使用 Guava 21。因此我的插件崩溃,因为它无法从 Guava 28.2 中找到一些方法。

有没有办法让我的插件加载它自己的 guava 版本并使用这个版本而不是旧版本?这可以使用类加载器魔术来完成吗?

感谢任何帮助

如果您正在为程序开发插件,请尽量遵守程序的限制。同一个库的多个版本的处理不是很简单,而且经常容易出错。

我会遵循的选项:

  • 降级到 Guava 21。
  • 建议升级到 Guava 21。
  • 如果该插件是 运行 应用程序服务器的一部分,请尝试部署为单独的应用程序,采用应用程序间通信。
  • 试试 OSGi。

不需要类加载器魔法。来自 Maven 的通缉机制称为 relocation。 重定位可以在编译时更改库的包以防止冲突。例如,使用它您可以将 com.google.commons 重新定位到 my.shaded.version.com.google.commons 并防止冲突。

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