java - JAR 版本依赖冲突 - Java

标签 java tomcat web-applications jar jboss

假设您有一个项目(网络应用程序)使用 2 个第三方库 - A 和 B。
说A依赖另一个第三方库C的1.10版本。
假设 B 依赖于同一个第三方库 C 的 1.15 版本。

您应该将哪个版本的 C 放在您的 Web 应用程序项目的 lib 文件夹中?!

假设您不太了解 C,您不确定 C 1.15 是否与 1.10 兼容,或者类似的东西。

有没有办法将 A.jar 和 B.jar,以及两个 C jar 放在项目的 lib 文件夹中,但在运行时(例如在 Tomcat 或 JBoss 下)有 A 加载 C 1.10 jar,但有 B 加载C 1.15 jar 。

我不认为这是可能的,因为它们共享相同的网络应用程序类加载器(因此它会从 1.10 或从 1.15 加载 C 类,这几乎是不可预测的;两个 JAR 中的哪个恰好是第一个在类路径)......但我不确定。

如果确实不可能,那么处理此类冲突的最佳做法是什么?

最佳答案

可以提出两个解决方案- 1) 使用不同版本的 jar 为 A 和 B 编写类加载器。您可以将 C jar 文件放在 lib 和 Web 应用程序中的两个不同文件夹中。并使用不同的类加载器为 A 和 B 创建对象。这是一种切实可行的方法,但会奏效。

2) 虽然不确定,但 OSGI 可能会有所帮助。

关于java - JAR 版本依赖冲突 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115414/

相关文章:

javascript - HTML+JavaScript 用于 Web 应用程序的局限性和 future

java - 如果我改变了java类的包。旧序列化版本的反序列化仍然有效吗?

java - 如何分离Tomcat中的web应用日志记录

java - Tomcat 在请求完成时删除文件?

java - 如何开始使用 Java 构建 Web 应用程序?

java - 托管使用Java和Rails代码的Web应用程序?

java - BufferedWriter 未将文本写入文本文件

java 集合和数组列表

java - 使用java比较数据库的日期计算6个月后的日期

spring-boot - Spring Boot Jenkins CD/CI 在部署前更改配置文件