java - 当两个 Java 框架需要第三个但两个都需要不同版本的第三个时会发生什么?

标签 java frameworks jar dependencies

在我的 Java 项目中,我使用了两种不同的框架(比如 A.jar 和 B.jar),它们都需要一个通用框架(比如 Log4j.jar),但有两个不同的版本。如果框架 A 需要 Log4J v1.1 而 B 需要 Log4j v1.2,Java 如何处理?它会导致某种冲突/错误还是会以某种方式(如何?)解决?

如果不会引起冲突/错误(我的项目可以编译运行)——我可以在这个项目中自己使用任何版本的Log4j吗?或者我是否被迫选择较低/较高版本号的 Log4j?

更新:更具体... 如果 Log4j API 的某些部分在 v1.2 中发生变化(假设一个方法 doIt() 签名发生变化)并且 A 和 B 都调用 doIt 会怎样?会发生什么?我的项目会运行吗?它会在第一次使用 doIt 时崩溃吗?我必须在类路径中放置什么版本的 Log4j - v1.2 或两者?

最佳答案

在平面类加载方案中,没有库版本控制支持。您需要使用最新版本的库并从类路径中删除其他版本。

一些框架,如 OSGi,提供了处理这些情况的机制,但不清楚您是否依赖插件框架。


编辑:

What if some part of Log4j API changed in v1.2 (let's say one single method doIt() signature changed) and both A and B call doIt. What will happen? Will my project run? Will it crash on first use of doIt?

依赖于不存在的签名的调用可能会导致 NoSuchMethodError。在调用该方法之前,这可能不会发生。如果其他机制依赖于签名(例如类继承),则可能会出现其他错误。

What version of Log4j I must put on classpath - v1.2 or both?

在类路径上创建两个版本的库只会导致一组类被随机加载。该行为将是未定义的,但可能会导致各种令人不快的错误和异常。

关于java - 当两个 Java 框架需要第三个但两个都需要不同版本的第三个时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2041876/

相关文章:

ios - 将框架嵌入到另一个框架中

.net - 是否有类似于 Ruby 的 Sinatra 的 .NET 框架?

java - 记录时屏蔽异常消息中的数据

java - 如何访问类的目的实例并传递数据?

c# - 配置管理器类

grails - Grails 2.4.2-package-plugin --binary-重命名生成的JAR

java - 如何在 Torque Clusterr 上查看 .jar 作业的进度

java - 数十种 getter 方法与单个 get 方法

java - 为什么我们不能将 BigDecimal 添加到 TreeSet ?

java - 从 .jar 文件夹中读取文件