java - 运行时使用插件的不同库版本

在多次使用插件(例如 Minecraft 服务器、IDE 等)的 Java 应用程序中,有必要使用一些库并将其隐藏在您的 .jar 中。

另一个 插件也使用该库并将其包含在它的 .jar 中但使用不同版本 时,就会出现问题,两个插件在满足之前都可以正常工作在同一个类加载器下,类加载器将只加载一个版本的库,而另一个插件将以不同于它设计的版本运行,如果库是,则导致 NoSuchMethodExceptions 和/或不同的运行时行为不向后兼容。

注意:这个问题不是关于当2个依赖项具有相同的临时依赖项但版本不同时如何使用maven进行编译。在这种情况下,问题有很大不同,因为您无法在编译时解决甚至检测依赖性问题,因为库的不同版本不会在同一个 .jar 中,也不在同一个项目中,只能在同一个类加载器下在给定时间由 2 个插件可能由不同的作者出于不同的目的制作。

避免此类冲突的一般策略是什么?

如果我正在制作自己的库并且它不能向后兼容,我该怎么做才能避免这个问题?

最佳答案

这是一个经典的 Java 问题,目前正在进行一些主要的 Java 技术重新设计来改变这一点,尽管这些已经有一段时间了(Java 9 或 Java 10)。

目前,您能做的最好的事情就是对您的项目进行明确且定期的依赖性分析。

首先,运行这个:mvn dependency:tree

您将能够看到同一依赖项的多个版本。不幸的是,当使用外部库时,您可能需要符合它们使用的相同依赖版本,或者寻找外部依赖的更新版本。

我在依赖分析上花费了很多时间,而且大部分时间都必须手动完成(使用 java 的问题之一......)

如果您正在制作自己的软件,我们会显式 API 版本控制,并在您进行重大更改时对版本进行重大更改。

例如,使用“1.1版”、“1.2版”等。让人们知道版本 1.1.11.1.4 向后兼容 1.1,但是一旦您引入 API 重大更改(发生这种情况),转到版本 1.2 并强制人们更新。

https://stackoverflow.com/questions/49237302/

相关文章:

json - 使用 REST API 的 POST 方法进行读取操作

python - 删除使用 imageio 或 PIL 创建的 GIF 中的空间插值或压缩

apache-flink - 在不重启作业的情况下在 Apache Flink 中动态添加模式

python - BeautifulSoup- find_all- 订单保存

python - 模仿 AWS CLI/gcloud 命令行参数

google-app-engine - 如何在 objectify 中通过嵌套 Refs 进行查询

c# - 如何在 OData v4 中获取枚举值而不是枚举名称?

google-bigquery - bigquery 备份所有 View 定义

android - 在 test.Jar 中启动 startActivity() ,Cordova

security - 自动关联社交登录有什么安全风险(Oauth2)