java:将jar的特定版本加载到我的类中
我有一种情况,同一个jar有两个版本,比如Jv1.jar和Jv2.jar。我已经编写了一个java类,它需要Jv2.jar中的所有类。我怎么知道的?非常感谢立即提供帮助。非常感谢。最好的解决方案是将所有代码迁移到使用Jv2.jar并删除Jv1.jar 否则,您必须在类路径中将Jv2.jar放在Jv1.jar之前,因为URLClassLoader 将从第一次出现时加载该类。 不推荐使用此解决方案,因为其他开发人员或您自己在几周内都不容易理解此解决方案,并且取决于URLClassLoader的实现 您必须将其视为一个jar覆盖层 例如:java:将jar的特定版本加载到我的类中,java,Java,我有一种情况,同一个jar有两个版本,比如Jv1.jar和Jv2.jar。我已经编写了一个java类,它需要Jv2.jar中的所有类。我怎么知道的?非常感谢立即提供帮助。非常感谢。最好的解决方案是将所有代码迁移到使用Jv2.jar并删除Jv1.jar 否则,您必须在类路径中将Jv2.jar放在Jv1.jar之前,因为URLClassLoader 将从第一次出现时加载该类。 不推荐使用此解决方案,因为其他开发人员或您自己在几周内都不容易理解此解决方案,并且取决于URLClassLoader的实现
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
将加载Jv2.jar类A
A
- 如果您的代码使用class
将加载Jv1.jar类D
D
D
使用classB
,将加载Jv2.jar中的classB
,而不是Jv1.jar中的classB
因此,如果D
调用B
的方法,则只有当类B
在Jv1.jar和Jv2.jar之间是二进制兼容的时,它才能工作
但请记住,它仍然可能导致意外行为。因为二进制兼容性并不一定意味着方法的前置和后置条件没有改变
如果您需要在类路径中使用不同版本的JAR,并同时使用其中一个版本,那么您应该考虑OSGI。那么您需要Jv1做什么?您正在使用maven吗?还是直接添加库?在这种情况下,还需要从build path.jv1中删除。假设我已经编写了一个名为Sample的类,我需要Jv2中的所有类,而Jv1中没有。有什么建议吗?问题是Jv1.jar具有某些必需的功能,而Jv2.jar中没有这些功能,反之亦然。没有别的办法了吗?谢谢你的时间和耐心