2011-11-03 13 views
17

Uso eclipse per lo sviluppo di Google Android.NoClassDefFoundError sul progetto di libreria esterna per Android

Ho creato un progetto di libreria ([x] Is Library nelle impostazioni di Android), che include un file jar esterno (librerie di riferimento). Questo progetto di biblioteca viene fatto riferimento in un altro progetto (il progetto reale che utilizzerà il progetto di libreria). Questo viene fatto aggiungendo il progetto sotto le impostazioni di Android.

la fonte compila, ma se voglio eseguirlo sul dispositivo, ottengo il NoClassDefFoundError per una classe che è all'interno del vaso-file che viene incluso nel progetto di libreria.

Edit: Il vaso file ist aggiunto alle voci esportate ([x] my.jar sul Order and Export -Tab del progetto biblioteca)

C'è un modo pulito per ottenere questo lavoro?

+0

sei sicuro che la classe non trovata è nel bar di riferimento? ci sono una serie di problemi con le classi java regolari a cui fanno riferimento i jar che si trovano in Java ma che non sono in Dalvik come alcune javax e tutte le classi lava.beans – kostja

+0

se è nel jar, hai aggiunto il jar agli elementi esportati? – kostja

+0

@kostja: Sì, ho modificato la mia domanda. – Fu86

risposta

15

E 'stato chiaramente affermato nella API offcial here:

Un progetto di libreria può includere una libreria JAR

È possibile sviluppare un progetto di libreria che si include una libreria JAR, tuttavia è necessario manualmente modificare il percorso di costruzione del progetto di applicazione dipendente e aggiungere un percorso per il file JAR

il lib vaso deve essere aggiunto manualmente al pr applicazione dipendente oject il percorso di build di, non solo il percorso di generazione del progetto di libreria stesso.

Aggiornamento dal SDK r17:

Questo viene gestito automaticamente da ADT ora, controlla nuova funzionalità per ADT 17.0.0 rilascio here:

caratteristica aggiunta a automaticamente di impostazione JAR dipendenze. Tutti i file .jar nella cartella/libs vengono aggiunti alla configurazione di build (simile a come funziona il sistema di build Ant). Inoltre, i file .jar necessari per i progetti di libreria vengono automaticamente aggiunti ai progetti che dipendono da tali progetti di libreria. (more info)

+1

ciò significa che il progetto principale che utilizza il progetto di libreria che utilizza il file jar deve anche avere il file jar nel percorso di creazione Java e spuntarlo nella scheda Ordine ed esportazione ... Ho passato un po 'di tempo ad aggiungere i progetti e i file jar inutilmente .. costruire OK ma runtime noclassdeffoundexception – Zennichimaro

1

Ho avuto un problema minore quando ho aggiornato a ADT17 in cui le mie librerie non venivano importate correttamente. Si scopre che questo è dovuto al fatto che le mie librerie erano collegate come dipendenze dalla mia cartella lib e non dalle librerie!

Sembra librarys devono essere nella cartella libs da ora

+0

Aveva lo stesso. Ulteriori dettagli: http://stackoverflow.com/questions/9885971/new-android-sdk-17-issue-in-my-app – Remi

2

Vai project properties -> build path-> libraies

Se vedete i vostri file jar come questo

snmp4j.jar - e:\software\jars 

del maggio il problema

Add cartella libs nel tuo progetto e copia il file jar in quella cartella. Fai clic con il pulsante destro del mouse su jar e vai su build path -> add to build path.Quindi puoi vedere il tuo contenitore come

snmp4j.jar - project_name/libs 

Ha funzionato per me.

7

Per coloro che hanno seguito i passaggi (anche controllare i progetti in "Ordine ed esportazione") e avere ancora java.lang.ClassNotFoundException nell'API 17, il passaggio finale è controllare che il compilatore non funzioni con Java 1.7. Se è 1.7 allora dovresti cambiarlo in 1.6 per tutti i tuoi progetti. Dopo di che vi chiederà di ricostruire tutti i progetti e corse con successo sul mio telefono :)

Per modificare la versione Java di compilazione in Eclipse, questo si trova in: Proprietà del progetto> Java Compiler> Compiler Livello di conformità: 1.6

+1

perché dovremmo aver bisogno di fare questo? – Nezam

+0

+1 Eccellente, questo ha risolto il problema per me. Pazzesco dovrebbe accadere in primo luogo però ... –

+0

+1 Questo ha funzionato, ma nel mio caso, è stato che avevo solo bisogno di una ricostruzione. Grazie. = D – Suzi

0

Un'altra cosa a cui prestare attenzione è il nome del pacchetto della libreria.

Se si utilizza ADT21 e si dispone di librerie con lo stesso nome di pacchetto, si verificherà un errore durante la compilazione ma verrà comunque compilato ed eseguito in Eclipse, fornendo un APK in cui mancano alcune delle classi di risorse . Da qui l'arresto anomalo durante l'esecuzione dell'app.

Se lo si compila con ANT, si può vedere l'errore di compilazione che dice che due o più librerie usano lo stesso nome di pacchetto.

Per risolvere questo problema, rinominare il progetto della libreria utilizzando Strumenti Android -> Rinomina pacchetto applicazioni. Quindi tutto tornerà alla normalità.

Mi ci sono voluti quasi tutta la giornata per capirlo ...

2

ho avuto due progetti che utilizzano la stessa libreria: uno di lavoro, l'altra schiantarsi con java.lang.NoClassDefFoundError. Dopo che nient'altro mi ha aiutato, ho esaminato il file project.properties nella directory principale del mio progetto. Il progetto di lavoro ha avuto il android.library.reference linea (l'ultima riga in basso), il crash non ha fatto:

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

ho aggiunto manualmente la linea e ha iniziato a lavorare! (Sì, ho provato entrambi (progetto) proprietà - java percorso di generazione - progetti e proprietà (progetto) - java percorso di generazione - order ed esporta -. Non serviva a niente)

PS Tra l'altro, "proprietà del progetto" ha anche la scheda "riferimenti di progetto". Non ho idea se avrebbe funzionato.

1

Ho avuto un problema simile e non è stato risolto alcun problema.

Versione breve: il JAR è stato compilato in Java 1.7 e non è stato trovato da Dalvik.

Costruiamo un JAR interno che condividiamo con back-end e client mobili con Maven. Il problema è che il JAR è stato compilato con Java 1.7. Androids dalvik supporta solo Java 1.5 e 1.6. Questo è il motivo per cui tutto funziona bene in Eclipse in quanto non è compilato da Dalvik a questo punto.

Abbiamo anche specified the target and source version in the Maven compiler plugin da compilare con Java 1.6. Questo non ha funzionato perché solo JDK 1.7 è stato installato sulla macchina di compilazione.Una piccola nota in fondo alla pagina Maven ci ha dato il suggerimento: Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

Per vedere se si dispone di questo problema pure, rinominare il file *.jar per *.zip scompattarlo, e cercare nel file MANIFEST.MF per il parametro Build-Jdk: a guarda quale versione di Java ha effettivamente compilato il tuo JAR.

Problemi correlati