java:将jar的特定版本加载到我的类中

java:将jar的特定版本加载到我的类中,java,Java,我有一种情况,同一个jar有两个版本,比如Jv1.jar和Jv2.jar。我已经编写了一个java类,它需要Jv2.jar中的所有类。我怎么知道的?非常感谢立即提供帮助。非常感谢。最好的解决方案是将所有代码迁移到使用Jv2.jar并删除Jv1.jar 否则,您必须在类路径中将Jv2.jar放在Jv1.jar之前,因为URLClassLoader 将从第一次出现时加载该类。 不推荐使用此解决方案,因为其他开发人员或您自己在几周内都不容易理解此解决方案,并且取决于URLClassLoader的实现

我有一种情况,同一个jar有两个版本,比如Jv1.jar和Jv2.jar。我已经编写了一个java类,它需要Jv2.jar中的所有类。我怎么知道的?非常感谢立即提供帮助。非常感谢。

最好的解决方案是将所有代码迁移到使用Jv2.jar并删除Jv1.jar

否则,您必须在类路径中将Jv2.jar放在Jv1.jar之前,因为URLClassLoader 将从第一次出现时加载该类。 不推荐使用此解决方案,因为其他开发人员或您自己在几周内都不容易理解此解决方案,并且取决于URLClassLoader的实现

您必须将其视为一个jar覆盖层

例如:

              Jv2.jar                                 Jv1.jar

    +- com                                    +- com
      +- company                                +- company
        +- A.class                               +- A.class
        +- B.class                               +- B.class
        +- C.class                               +- D.class           
不要假设Jv2.jar在类路径中位于Jv1.jar之前

  • 如果您的代码使用class
    A
    将加载Jv2.jar类
    A
  • 如果您的代码使用class
    D
    将加载Jv1.jar类
    D
现在是棘手的部分:

如果Jv1.jar中的class
D
使用class
B
,将加载Jv2.jar中的class
B
,而不是Jv1.jar中的class
B

因此,如果
D
调用
B
的方法,则只有当类
B
在Jv1.jar和Jv2.jar之间是二进制兼容的时,它才能工作

但请记住,它仍然可能导致意外行为。因为二进制兼容性并不一定意味着方法的前置和后置条件没有改变


如果您需要在类路径中使用不同版本的JAR,并同时使用其中一个版本,那么您应该考虑OSGI。

那么您需要Jv1做什么?您正在使用maven吗?还是直接添加库?在这种情况下,还需要从build path.jv1中删除。假设我已经编写了一个名为Sample的类,我需要Jv2中的所有类,而Jv1中没有。有什么建议吗?问题是Jv1.jar具有某些必需的功能,而Jv2.jar中没有这些功能,反之亦然。没有别的办法了吗?谢谢你的时间和耐心