背景
我有一个必须更新的公共库。这个公共库有一个第三方依赖(jgroups),它在新版本中发生了显着变化。通过传递依赖,有时需要更新版本的 jgroups,这会破坏公共库。我需要更新一些类以兼容新版本,同时保持向后兼容性。
问题
JGroups 提供了一个View
类,它有一个方法getMembers()
。在旧版本 (2.10.0) 中,此方法返回Vector<Address>
,而在较新版本 (3.2.7) 中,此方法返回List<Address>
. 的任何实现java.util.Collection
都对我有用,但问题是我得到了一个NoSuchMethodException
. 据我了解,getMembers()
找到的方法具有旧的Vector<Address>
返回类型(基于公共库中的 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.xml 中添加排除项来排除正在引入的旧版本的 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>