0

我有一种情况,同一个 jar 有 2 个版本,比如 Jv1.jar 和 Jv2.jar。我编写了一个需要 Jv2.jar 中所有类的 java 类。我怎么知道的?非常感谢您的即时帮助。万分感谢。

4

1 回答 1

1

最好的解决方案是迁移所有代码以使用 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 之前。

  • 如果您的代码使用类A,则将加载 Jv2.jar 类A
  • 如果您的代码使用类D,则将加载 Jv1.jar 类D

现在,棘手的部分来了:

如果DJv1.jar 中的类使用 class BB则将加载 Jv2.jar 的类,而不是BJv1.jar 中的类。

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

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

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

于 2013-09-18T10:45:54.973 回答