在我的 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 calldoIt
. What will happen? Will my project run? Will it crash on first use ofdoIt
?
依赖于不存在的签名的调用可能会导致 NoSuchMethodError
。在调用该方法之前,这可能不会发生。如果其他机制依赖于签名(例如类继承),则可能会出现其他错误。
What version of Log4j I must put on classpath - v1.2 or both?
在类路径上创建两个版本的库只会导致一组类被随机加载。该行为将是未定义的,但可能会导致各种令人不快的错误和异常。
关于java - 当两个 Java 框架需要第三个但两个都需要不同版本的第三个时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2041876/