4

我知道这个问题已经被问过了,但是在谷歌搜索了大约一个小时后,不知何故我找不到任何令人信服的解决方案。

我正在使用 apache-jena 从 url 加载 RDF 模型。我收到IncompatibleClassChangeError以下消息

Class org.apache.http.impl.client.SystemDefaultHttpClient does not implement the requested interface org.apache.http.client.HttpClient

有人可以指点我如何解决这个错误。

问候阿山

4

1 回答 1

3

当某些类定义发生不兼容的类更改时,会抛出此错误。当前执行的方法所依赖的某个类的定义已经改变。通常在基类的非final字段变为静态时,或者当基类变为接口(反之亦然)等时抛出。 IncompatibleClassChangeError扩展了LinkageError,这与从基类产生的问题有关在编译子类后会发生变化。

请在这里阅读更多

http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-incompatibleclasschangeerror-how-to-resolve-incompatible-class-change-error/

http://howtodoinjava.com/2013/05/25/solved-java-lang-incompatibleclasschangeerror-implementing-class/

您新打包的库与旧版本不向后二进制兼容 (BC)。由于这个原因,一些未重新编译的库客户端可能会抛出异常。

这是 Java 库 API 更改的完整列表,这些更改可能会导致使用旧版本库构建的客户端在新版本上运行时抛出 java.lang.IncompatibleClassChangeError(即破坏 BC):

非最终字段变为静态,非常量字段变为非静态,类变为接口,接口变为类,如果向类/接口添加新字段(或添加新的超类/超接口)则为静态字段从客户端类 C 的超接口可能隐藏从 C 的超类继承的添加字段(具有相同名称)(非常罕见的情况)。注意:还有很多其他不兼容的更改导致的异常:NoSuchFieldError、NoSuchMethodError、IllegalAccessError、InstantiationError、VerifyError、NoClassDefFoundError 和 AbstractMethodError。

关于 BC 的更好的论文是 Jim des Rivières 撰写的“Evolving Java-based APIs 2: Achieving API Binary Compatibility”。

还有很多自动工具可以检测这种变化:

japi-compliance-checker clirr japitools sigtest japi-checker japi-compliance-checker 用于您的库 (*.jar):

japi-compliance-checker OLD.jar NEW.jar clirr 工具的用法:

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar

于 2015-09-25T12:08:28.427 回答