2009-07-24 90 views
2

我在Eclipse中的一個項目工作,當我啓動使用碼頭插件給了我java.lang.AbstractMethodError在Eclipse中使用jetty運行webapp。

java.lang.AbstractMethodError: 
au.com.mycopmpany.impl.MyClassDAOImpl.findById(Ljava/lang/Integer;)Ljava/lang/Object;. 

此文件在Eclipse編譯罰款和代碼實現方法有關錯誤的會談。從我的閱讀中,這個錯誤表明「在運行時」,JVM發現一個沒有實現此方法的類。

但我可以向你保證MyClassDAOImpl肯定有findById方法用正確的簽名實現。

這看起來像是Eclipse編譯器中的一個bug;我可以通過在命令提示符下運行maven package來解決這個問題,然後在Eclipse中運行應用程序就能正常工作。

看來,Eclipse編譯器有一些與這個類有關的錯誤。我在網上閱讀了一些關於Eclipse編譯器中的泛型的錯誤(該類使用泛型),但是這個基類/接口在我們的代碼庫中重複實現,而且這個類總是有問題。

有沒有人知道解決方法,或更好的解決這個問題?

我可以每次都複製這個異常,所以如果Eclipse編譯器開發人員讀到這個,這是一個已知的問題,請隨時聯繫我以尋求幫助來跟蹤問題。

更新:

與問題的類是許多實現GenericDAO之一,通用接口定義爲:

public interface GenericDAO<T, TList> 

有問題的方法失敗是:

public T findById(Integer integer) throws APIException; 
+1

什麼是基類或接口聲明參數爲;整數,或者鏈上的東西,比如Serializable?我想知道是否它生成的代碼需要更高的參數(比如Serializable),但是它獲得了Integer,並且不知道它實現了Serializable。 – lumpynose 2009-07-24 00:57:17

+1

難道你需要用超級或擴展來聲明你的id參數的類型嗎?例如,公共抽象類BaseDao >請注意,我只是在黑暗中刺穿而猜測。 – lumpynose 2009-07-24 01:06:25

+0

Lumpynose - 這可能是一個解決方案,我會嘗試,但有30個其他類實現此接口,他們工作正常。 – stevemac 2009-08-01 10:52:39

回答

6

嘗試重建您的代碼。

我猜你已經有了一個DAO接口,並且接口和impl的簽名略有不同,以至於編譯器沒有看到接口完全由具體的impl類實現。也許Eclipse不同步。

如果這不起作用,請查看Eclipse是否允許您從接口方法導航到具體實現。如果它不能,那麼這就是編譯器告訴你的線索。

檢查您的CLASSPATH。也許你認爲被JVM加載的impl不是。

如果您認爲這是編譯器的問題,請檢查錯誤列表。

如果您在列表中看不到錯誤,請假定您是問題所在。很多人使用它;一個嚴重的問題早已被發現並修復。

清理Jetty部署 - WAR和所有臨時文件。重建和重新部署。也許Jetty堅持使用較舊版本的.class文件,這將解釋它爲什麼在命令行上工作,而不是在部署到Web時。

假設你是問題的第一個,最後一個,並且總是。

更新:有沒有辦法切換Eclipse使用的JDK?你可以指向Sun JDK嗎?

這是我憎恨Eclipse的另一個原因。你的故事如果屬實,會讓我更加快樂成爲一名IntelliJ用戶。

問題:你正在執行IBM's generic DAO

0

我知道你已經說過你可以導航代碼,它都檢查確定,但你有沒有嘗試導航時調試?如果你在findById被調用之前中斷了,然後進入你的Impl類嗎?這可能會給你一些關於可能的類路徑混淆的提示......

0

你說它使用Sun編譯器從命令行運行正常,所以我假設Eclipse和Sun編譯器都將它們的類輸出到相同的目錄中?

我在使用Eclipse和Sun編譯器時遇到了類似的問題,在保持類文件同步的問題上存在問題。 Eclipse使用自己的內置編譯器而不是Sun編譯器,這會爲相同的代碼生成不同的類文件(例如,串行版本的UID不匹配)。

我發現的最佳解決方案是爲Eclipse和Sun編譯器使用單獨的bulid文件夾。這樣你的源代碼如果總是同步的,但類文件不能相互衝突。

0

看看你的類路徑。
接口名稱可能沿着不同包中的類路徑複製;並且eclipse會自動導入錯誤的包。

我花了很多時間一個很好的協議撕毀我的頭髮,當它發生/ +:

如果你已經有解決方案,請您在這裏發佈過?

0

@Override註釋是否有幫助?如果您可以將其編譯爲編譯時錯誤,您可能能夠獲得有關該問題的更多信息。

也可能是一個好主意,完全限定相關文件中的相關類名。

1

嘗試禁用內部編織:(persistence.xml中eclipselink.weaving.internal=false

0

剛剛清理項目,然後Maven構建項目。錯誤消失了。作爲初學者
要日食,我覺得IDE就像一個孩子,你應該有耐心面對不穩定。

相關問題