2011-11-03 65 views
17

我使用eclipse進行Google Android開發。針對Android的外部庫項目的NoClassDefFoundError

我已經創建了一個庫項目(Android設置中的[x] Is Library),其中包含一個外部jar文件(Referenced Libraries)。該庫項目在另一個項目中引用(實際項目將使用庫項目)。這是通過在Android設置下添加項目完成的。

源代碼編譯,但如果我想在設備上執行它,我會得到一個類爲的類中的NoClassDefFoundError,它包含在庫項目中包含的jar文件中。

編輯:的JAR文件IST加入到(上Order and Export -Tab [x] my.jar從庫項目)導出的條目

有沒有乾淨的方式來得到這個工作?

+0

你確定未找到的類是在引用的jar嗎? java jar中引用的常規Java類存在很多問題,但不在Dalvik中,比如某些javax和lava.beans類 – kostja

+0

如果它在jar中,是否將jar添加到了導出的項目中? – kostja

+0

@kostja:是的,我修改了我的問題。 – Fu86

回答

15

它已offcial API here已經明確提出:

庫項目可以包括JAR庫

你可以開發一個庫項目,本身包括JAR庫,不過你需要手動編輯從屬應用程序項目的構建路徑並添加JAR文件的路徑

必須將jar庫手動添加到從屬應用程序中它不僅僅是圖書館項目的構建路徑本身,而且還包括的構建路徑。從SDK R17

更新:

這是自動ADT現在處理的,看看新特性,ADT 17.0.0版本here

新增功能自動安裝JAR的依賴。/libs文件夾中的任何.jar文件都被添加到構建配置中(類似於Ant構建系統的工作方式)。另外,庫項目所需的.jar文件也會自動添加到依賴於這些庫項目的項目中。 (more info

+1

這意味着使用jar文件的庫項目的主項目也必須在Java Build Path中包含jar文件,並在Order和Export選項卡中將其打勾......我花了很長時間添加項目和jar文件沒有用..建立好但運行時noclassdeffoundexception – Zennichimaro

1

我有一個小問題,當我升級到ADT17時,我的庫沒有正確導入。原來,這是因爲我的圖書館被鏈接爲我的lib文件夾而不是libs的依賴關係!

好像圖書館的必須在libs文件夾從現在

+0

有相同的。更多細節:http://stackoverflow.com/questions/9885971/new-android-sdk-17-issue-in-my-app – Remi

2

轉到project properties -> build path-> libraies

如果你看到這樣

snmp4j.jar - e:\software\jars 

它可能您的問題

添加您的jar文件libs文件夾並將該jar文件複製到該文件夾​​中。右鍵單擊jar文件並轉到build path -> add to build path。然後你可以看到你的罐子作爲

snmp4j.jar - project_name/libs 

它爲我工作。

7

對於那些遵循這些步驟(甚至檢查「Order and Export」中的項目)並且仍然在API 17中存在java.lang.ClassNotFoundException的人,最後一步是檢查您的編譯器是否不能與Java一起運行1.7。如果是1.7,那麼你應該把它改爲1.6爲所有你的項目。之後,它會要求重建所有項目,併成功運行,我的手機:)

要改變Eclipse的Java編譯版本,這個坐落在:項目屬性> Java編譯器>編譯器的級別:1.6

+1

爲什麼我們需要這樣做? – Nezam

+0

+1非常好,這解決了我的問題。瘋狂這應該發生在第一位,雖然... –

+0

+1這工作,但在我的情況,這是我只需要重建。謝謝。 = d – Suzi

0

另一件需要注意的是庫包名。

如果您使用的是ADT21,並且您碰巧擁有相同軟件包名稱的庫,那麼在編譯過程中會出現錯誤,但它仍然會在Eclipse中編譯和運行,爲您提供缺少某些資源類的APK 。因此,當你運行應用程序時發生崩潰。

如果您使用ANT進行編譯,那麼您可以看到編譯錯誤,指出兩個或多個庫使用相同的包名稱。

要解決此問題,請使用Android工具 - >重命名應用程序包來重命名您的庫項目。然後一切都會恢復正常。

我花了幾乎整整一天摸不着頭腦......

2

我不得不使用相同的庫兩個項目:一個工作,另一個與java.lang.NoClassDefFoundError崩潰。 在沒有其他人幫助我之後,我查看了我項目根目錄下的文件project.properties。 工作項目有android.library.reference線(下面的最後一行),崩潰的一個都沒有:

# Project target. 
target=android-17 
android.library.reference.1=../my-library-project 

我手動添加的行,它開始工作! (是的,我曾嘗試都(項目)屬性 - Java構建路徑 - 項目(項目)屬性 - Java構建路徑 - 訂單和出口 - 沒有任何幫助)

PS順便說一句,「項目屬性」也有「項目引用」選項卡。不知道它是否會起作用。

1

我有一個類似的問題,非解決這裏的解決方案。

簡短版本: JAR編譯爲Java 1.7,Dalvik找不到它。

我們構建了一個內部JAR,我們通過Maven與後端和移動客戶端共享。最終的問題是JAR是用Java 1.7編譯的。 Androids dalvik僅支持Java 1.5和1.6。這就是爲什麼Eclipse中的所有東西都能正常工作的原因,因爲此時它不會編譯到達爾維克。

我們甚至specified the target and source version in the Maven compiler plugin與Java 1.6編譯。這不起作用,因爲只有JDK 1.7安裝在生成機器上。在Maven的頁面底部的小紙條給我們的提示:Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

要看到,如果你有這個問題爲好,重命名*.jar文件*.zip解壓,並期待在MANIFEST.MF文件的Build-Jdk:參數看看哪個Java版本實際編譯了你的JAR。

相關問題