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

标签 java dependencies classloader conflict

在多次使用插件(例如 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 并强制人们更新。

关于java - 运行时使用插件的不同库版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49237302/

相关文章:

java - 改造 2.0.1 添加 cookie header 不起作用

java - 如何创建初始上下文以连接到sql server

java - Maven 依赖项 :list includeParents

java - JUnit类路径和ContextClassLoader不一致还是我的误解

java - JVM - Java 虚拟机损坏

java - 如何从富文本压缩和调整图像大小

java - 来自 Internet 的 SQLite 数据库

java - Hibernate ClassNotFound 异常 - jar 不兼容?

dependencies - gradle带时间戳的快照依赖项解析失败

java - 运行时代码生成和编译