java - 强制动态绑定(bind)

标签 java maven

问题

我正在重构/移植一个使用具有两个版本的外部 API 的应用程序,我们将它们称为 API 1.0API 2.0。 它使用API 2.0,但决定它应该支持API 1.0,而不必编译两个单独的应用程序。

API 2.0(几乎)与 1.0 相同,但具有额外的方法。 我将我的 Maven POM 配置为使用 API 1.0 作为依赖项并修复(使用兼容的 API)出现的所有编译错误

但是我面临以下问题: 当使用API 2.0编译时,它运行良好:

  • API 2.0
  • API 1.0

但是,当使用API 1.0进行编译时,它仅在API 1.0上运行良好,并在API 2.0上抛出NoSuchMethodException。

我跟踪了该问题并显示在以下代码中:

使用

import test.A;

public class Test {
    public static void main(String...args) {
        A a = new A();
        a.sayHello();
    }
}

API 1.0

package test;

public class A {
    public A sayHello() {
        System.out.println("Hello from API 1.0");
        return this;
    }
}

API 2.0

package test;

public class A extends B<A> {}

class B<T> {
    public T sayHello() {
        System.out.println("Hello from API 2.0");
        return (T) this;
    }
}

编译并运行它们

$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)

该方法是存在的,但是似乎需要 A sayHello() 而不是 T sayHello()。尽管T实际上是A。 据我了解,这似乎是静态与动态绑定(bind)问题。

问题

有没有办法保留 API 1.0 作为我的依赖项?

它非常适合在运行前发现错误。因此,强制动态绑定(bind)或使用 API 1.0 作为依赖项,但使用 API 2.0 或类似的东西进行编译对我来说很有用。

感谢您的宝贵时间。

最佳答案

您只能选择这两个 API 之一,因为无法区分使用 API 1 或 API 2 方法。

NoSuchMethodException 表示需要某个方法,但找不到它。

您也许能够使用反射来编译和运行可用的 API。

关于java - 强制动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937530/

相关文章:

java - 公共(public)类的父类(super class)可以是包私有(private)的吗?

java - 如何在 Maven 3 插件中获取依赖树?

java - 应用程序引擎 : jar in WEB-INF/lib but still getting java. lang.ClassNotFoundException

java - 属性 "Any"已定义。使用 <jaxb :property> to resolve this conflict

java - Maven 和 IntelliJ 资源

java - 在哪里可以设置spark.eventLog.enabled?

java - 不同语言的服务器和客户端可以互相通信吗?

java - 用于获取插入值的 Cassandra 示例触发代码

java - 查明对象是否已经是 ByteBuddy 代理

java - Apache Maven 程序集插件无法与 OSGi bundle 一起使用