2011-11-03 34 views
17

Tôi sử dụng nhật thực để phát triển Google Android.NoClassDefFoundError trên dự án thư viện bên ngoài dành cho Android

Tôi đã tạo một dự án thư viện ([x] Is Library trong cài đặt Android), bao gồm tệp jar bên ngoài (Thư viện tham chiếu). Dự án thư viện này được tham chiếu trong một dự án khác (dự án thực tế sẽ sử dụng dự án thư viện). Điều này được thực hiện bằng cách thêm dự án trong cài đặt Android.

biên dịch nguồn nhưng nếu tôi muốn thực thi nó trên thiết bị, tôi nhận được NoClassDefFoundError cho một lớp là bên trong tệp jar được bao gồm trong dự án thư viện.

Edit: Các ist jar-file thêm vào các mục xuất khẩu ([x] my.jar trên Order and Export -Tab từ dự án thư viện)

Có cách nào sạch sẽ để làm việc này?

+0

bạn có chắc chắn rằng lớp không tìm thấy nằm trong bình được tham chiếu không? có một số vấn đề với các lớp java thông thường được tham chiếu bởi các jars có trong java SE nhưng không có trong Dalvik như một số javax và tất cả các lớp lava.beans – kostja

+0

nếu nó nằm trong bình, bạn đã thêm jar vào các mục đã xuất chưa? – kostja

+0

@kostja: Vâng, tôi đã sửa đổi câu hỏi của mình. – Fu86

Trả lời

15

Nó đã được nêu rõ trong API offcial here:

Một dự án thư viện có thể bao gồm một thư viện JAR

Bạn có thể phát triển một dự án thư viện mà tự nó bao gồm một thư viện JAR, tuy nhiên bạn cần phải tự chỉnh sửa đường dẫn xây dựng của dự án ứng dụng phụ thuộc và thêm đường dẫn đến tệp JAR

lib mẫu phải được thêm thủ công vào ứng dụng phụ thuộc oject Đường dẫn xây dựng của oject, không chỉ đường dẫn xây dựng dự án thư viện.

Update từ SDK r17:

này được tự động xử lý bởi ADT bây giờ, kiểm tra tính năng mới cho ADT 17.0.0 phát hành here:

tính năng gia tăng để tự động thiết lập JAR phụ thuộc. Bất kỳ tệp .jar nào trong thư mục/libs được thêm vào cấu hình xây dựng (tương tự như cách hệ thống xây dựng Ant hoạt động). Ngoài ra, các tệp .jar cần thiết bởi các dự án thư viện cũng được tự động thêm vào các dự án phụ thuộc vào các dự án thư viện đó. (more info)

+1

điều này có nghĩa là dự án chính sử dụng dự án thư viện sử dụng tệp jar cũng phải có tệp jar trong Đường dẫn xây dựng Java và đánh dấu vào tab Đặt hàng và xuất ... Tôi đã dành khá nhiều thời gian để thêm dự án và tệp jar vô ích .. xây dựng OK nhưng thời gian chạy noclassdeffoundexception – Zennichimaro

1

Tôi gặp vấn đề nhỏ khi nâng cấp lên ADT17 nơi lib của tôi không được nhập đúng cách. Hóa ra điều này là do thư viện của tôi đã được liên kết như là phụ thuộc từ thư mục lib của tôi không phải libs!

vẻ librarys phải trong thư mục libs từ nay

+0

Nếu như vậy. Chi tiết khác: http://stackoverflow.com/questions/9885971/new-android-sdk-17-issue-in-my-app – Remi

2

Đến project properties -> build path-> libraies

Nếu bạn thấy file jar của bạn như thế này

snmp4j.jar - e:\software\jars 

của nó có thể vấn đề của bạn

Add thư mục libs trong dự án của bạn và sao chép tệp jar trong thư mục đó. Nhấp chuột phải vào tệp jar và đi build path -> add to build path.Sau đó, bạn có thể thấy bình của mình dưới dạng

snmp4j.jar - project_name/libs 

Nó làm việc cho tôi.

7

Đối với những người làm theo các bước (thậm chí kiểm tra các dự án trong "Đặt hàng và xuất khẩu") và vẫn có java.lang.ClassNotFoundException trong API 17, bước cuối cùng là kiểm tra xem trình biên dịch của bạn có chạy với Java không 1.7. Nếu là 1,7 thì bạn nên thay đổi nó thành 1.6 cho tất cả các dự án của bạn. Sau đó nó sẽ yêu cầu để xây dựng lại tất cả các dự án và chạy thành công trên điện thoại của tôi :)

Để thay đổi phiên bản java biên dịch trong nhật thực, này tọa lạc tại: tính chất dự án> Java Compiler> Compiler Tuân mức: 1,6

+1

tại sao chúng ta nên làm điều này? – Nezam

+0

+1 Tuyệt vời, điều này đã khắc phục được sự cố cho tôi. Điên này nên xảy ra ở nơi đầu tiên mặc dù ... –

+0

+1 Điều này đã làm việc nhưng trong trường hợp của tôi, đó là tôi chỉ cần xây dựng lại. Cảm ơn. = D – Suzi

0

Một điều cần lưu ý là tên gói thư viện.

Nếu bạn đang sử dụng ADT21 và bạn có thư viện có cùng tên gói, sẽ có lỗi trong khi biên dịch nhưng vẫn sẽ biên dịch và chạy trong Eclipse, cho bạn APK bị thiếu một số lớp tài nguyên . Do đó sự cố khi bạn chạy ứng dụng.

Nếu bạn biên dịch bằng ANT thì bạn có thể thấy lỗi biên dịch cho biết hai hoặc nhiều thư viện sử dụng cùng tên gói.

Để khắc phục điều này, hãy đổi tên dự án thư viện của bạn bằng cách sử dụng Công cụ Android -> Đổi tên gói ứng dụng. Sau đó mọi thứ sẽ trở lại bình thường.

Tôi đã mất gần như cả ngày để con số này ra ...

2

tôi có hai dự án sử dụng cùng một thư viện: một công việc, một trong những khác đâm với java.lang.NoClassDefFoundError. Sau khi không có gì khác giúp tôi, tôi nhìn vào tập tin project.properties trong thư mục gốc của dự án của tôi. Dự án làm việc có dòng android.library.reference (dòng cuối cùng dưới đây), các đâm một không:

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

tôi tự thêm vào dòng và nó bắt đầu làm việc! (Vâng, tôi đã thử cả hai (dự án) bất động sản - java xây dựng đường - dự ándự án) thuộc tính (- Java Build Path - trật tự và xuất khẩu -. Không có gì giúp)

PS Nhân tiện, "thuộc tính dự án" cũng có tab "tham chiếu dự án". Không có ý tưởng nếu nó sẽ làm việc.

1

Tôi gặp sự cố tương tự và không giải pháp nào ở đây đã khắc phục được sự cố đó.

Phiên bản ngắn: JAR được biên dịch trong Java 1.7 và không thể tìm thấy bởi Dalvik.

Chúng tôi tạo một JAR nội bộ mà chúng tôi chia sẻ trên các ứng dụng khách phụ trợ và di động với Maven. Vấn đề cuối cùng là JAR được biên dịch với Java 1.7. Android dalvik chỉ hỗ trợ Java 1.5 và 1.6. Đây là lý do tại sao mọi thứ hoạt động tốt trong Eclipse vì nó không được biên dịch thành dalvik vào thời điểm này.

Chúng tôi thậm chí specified the target and source version in the Maven compiler plugin để biên dịch bằng Java 1.6. Điều này không làm việc vì chỉ có JDK 1.7 được cài đặt trên máy xây dựng.Một lưu ý nhỏ ở dưới cùng của trang Maven đã cho chúng tôi những gợi ý: Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

Để xem nếu bạn có vấn đề này là tốt, đổi tên tập tin *.jar của bạn để *.zip giải nén nó, và tìm kiếm trong file MANIFEST.MF cho Build-Jdk: tham số để xem phiên bản Java thực sự đã biên dịch JAR của bạn như thế nào.

Các vấn đề liên quan