java - NoSuchMethodException - 方法的返回类型已更改 - 想要接受两种类型

标签 java eclipse maven jgroups transitive-dependency

背景

我有一个必须更新的公共(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/

相关文章:

eclipse - 在 SVN Eclipse 插件中搜索

java - 在 eclipse 中编译带有调试信息的 java 源文件

java - SonarQube 不接受外部生成的 JaCoCo 报告以覆盖 IT

java - Eclipse (pom.xml) 中的 Maven 错误 : Failure to transfer org. apache.maven.plugins :maven-surefire-plugin:pom:2. 12.4

java - gwt-可视化依赖不起作用?

java - 在Java中查找相同的对象

java - Spring 3 和 Hibernate 4 道

运行 jar 且其依赖项位于同一目录时出现 java.lang.ClassNotFoundException

java - SWT 表在鼠标悬停时在 Windows 8 计算机中不显示工具提示

java - 莫基托。未捕获任何参数值