2015-09-25 88 views
1

我知道這個問題已被問到,但不知何故,我找不到任何令人信服的解決方案後谷歌搜索約一個小時。如何解決IncompatibleClassChangeError接口未實現

我正在使用apache-jena從URL加載RDF模型。而我得到IncompatibleClassChangeError有以下消息

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

有人可以給一些指針我怎樣才能解決這個錯誤。

問候 阿赫桑

+0

重新編譯一切。 – EJP

+0

@EJP:做到了,但仍然沒有運氣。 –

回答

1

時不兼容的類變化而出現的某些類定義這被拋出。目前正在執行的方法所依賴的某個類的定義已經改變。當基類的非最終字段變爲靜態時,或者當基類變爲接口(反之亦然)時,通常會拋出它。 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 desRivières寫的「演變基於Java的API 2:實現API二進制兼容性」。

也有很多的自動工具來檢測這樣的變化:

JAPI遵守檢查器 clirr japitools 採用SigTest JAPI檢查器 使用JAPI,合規檢查的是你的庫(*。罐):

JAPI遵守檢查工具OLD.jar NEW.jar clirr工具的 用法:

Java的罐子clirr核-0.6-uber.jar -o OLD.jar -n NEW.jar