背景
我有一个必须更新的公共(public)库。该公共(public)库具有第三方依赖项(jgroups),该依赖项在新版本中发生了显着变化。通过传递依赖,有时需要更新版本的 jgroups,这会破坏 commons 库。我需要更新一些类以与新版本兼容,同时保持向后兼容性。
问题
JGroups 提供 View
类,它有一个方法 getMembers()
。在旧版本(2.10.0)中,此方法返回 Vector<Address>
在较新的版本 (3.2.7) 中,这将返回 List<Address>
。 java.util.Collection
的任何实现对我有用,但问题是我得到了 NoSuchMethodException
。据我了解,getMembers()
发现的方法有遗留Vector<Address>
返回类型(基于 commons 库中的 JGroups 依赖项),但我拖入了较新的 JGroups 版本,并且 View
类期望 List<Address>
从 getMembers()
返回方法。
堆栈跟踪
在 Eclipse 中启动应用程序时出现以下错误。
Caused by: java.lang.NoSuchMethodError: org.jgroups.View.getMembers()Ljava/util/Vector;
at com.mycompany.commons.messaging.events.impl.distributed.JGroupsEventDistributionProvider$JGroupsEventReceiver.viewAccepted(JGroupsEventDistributionProvider.java:136) ~[classes/:na]
at org.jgroups.JChannel.invokeCallback(JChannel.java:752) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
at org.jgroups.JChannel.up(JChannel.java:710) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:1020) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
at org.jgroups.protocols.pbcast.FLUSH.up(FLUSH.java:466) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
....
断裂的地方
Collection<Address> viewMembers = view.getMembers();
问题
是否可以支持这两个版本,即使它们是 Collection
的不同实现?我该如何处理这种直到运行时才知道方法返回类型的情况?
注意:
我尝试通过在我的 maven pom 中添加排除项来排除正在引入的旧版本 JGroups。这并没有奏效。
<dependency>
<groupId>com.mycompany.commons</groupId>
<artifactId>mycompany-commons-event-distributed-jgroups</artifactId>
<!-- Note: JGroups dependency is provided by infinispan -->
<version>1.0.2-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.jgroups</groupId>
<artifactId>jgroups</artifactId>
</exclusion>
</exclusions>
</dependency>
最佳答案
使用反射怎么样? Field View.members 在 2.10.x 中是一个 Vector,在 3.x 中是一个 Address[] 数组。您可以访问字段 View.members 并根据其类型将所有成员作为地址集合返回。不太好,但应该可以..
关于java - NoSuchMethodException - 方法的返回类型已更改 - 想要接受两种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32239362/