2016-05-11 8 views
0

Also muss ich die jexcelApi für mein Android-Projekt verwenden. Nach dem Einschließen bekomme ich keinen Compiler-Fehler, sondern eine Laufzeit-Ausnahme NoClassDefFoundError auf meinem Gerät für jede einzelne Klasse, die ich aus diesem Glas verwende. Das Dekompilieren zeigt, dass sich die benötigten Klassen im Jar befinden.NoClassDefFoundError obwohl .jar ist korrekt enthalten

Ich habe folgende Schritte:

  1. das Glas heruntergeladen
  2. kopiert es auf {Stammordner}/libs
  3. compile fileTree(include: ['*.jar'], dir: 'libs') in meinem gradle Build-Skript
  4. sauber Projekt
  5. aufgerufen
  6. Erbaut das Projekt

Voll logcat Eintrag:

05-11 23:28:05.234 26289-26289/? E/Assignment: Spreadsheet Error 
java.lang.NoClassDefFoundError: jxl.write.WritableFont 
at com.example.bene.assignment.spreadsheet.SpreadsheetController.<init>(SpreadsheetController.java:43) 
at com.example.bene.assignment.spreadsheet.SpreadsheetController.create(SpreadsheetController.java:34) 
at com.example.bene.assignment.MainActivity.onCreate(MainActivity.java:62) 
at android.app.Activity.performCreate(Activity.java:5008) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2035) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2096) 
at android.app.ActivityThread.access$600(ActivityThread.java:138) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1207) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:213) 
at android.app.ActivityThread.main(ActivityThread.java:4787) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
at dalvik.system.NativeStart.main(Native Method)bs') 

Grüße folgenden Code:

// create Formats 
WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10); 
// Define the cell format 
mTimes = new WritableCellFormat(times10pt); 
// Lets automatically wrap the cells 
mTimes.setWrap(true); 

// create create a bold font with unterlines 
WritableFont times10ptBoldUnderline = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD, false, UnderlineStyle.SINGLE); 
mTimesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline); 
// Lets automatically wrap the cells 
mTimesBoldUnderline.setWrap(true); 

Ich weiß wirklich nicht, wie, um fortzufahren bitte helfen Sie mir! Vielen Dank im Voraus.

UPDATE

So fand ich gerade heraus, dass einige Pakete transitive Abhängigkeiten bekommen haben, die sie kompilieren einbezogen werden müssen. So fand ich folgende Links:

  • Maven repository
  • Source (kann es nicht veröffentlichen, weil der Stackoverflow restrictrions)

Zuerst sagen, dass ich compile 'log4j:log4j:1.2.14' brauchen würde, zweitens sagen, dass ich

bräuchten
compile 'org.slf4j:slf4j-api:1.7.2' 
compile 'org.slf4j:slf4j-log4j12:1.7.2' 

Nach dem Maven-Link, bekomme ich das gleiche Ergebnis über

compile('net.sourceforge.jexcelapi:jxl:2.6.12') { 
    transitive= true 
} 

, die auf diese Aufgabe mein Abhängigkeitsbaum macht aussehen wie folgt: Dependency Tree

immer noch die gleiche Ausnahme beim Abrufen ...

Antwort

-1

So fand ich meine Lösung.

Obwohl meine Probleme magisch verschwand nach dem Versuch, eine andere lib und anschließend diese Änderungen verwerfen und erneut mit JexcelApi versuchen, fand ich die Lösung hier: About noClassDefFoundError.

Nochmals zu den transitiven Abhängigkeiten: Ihr Projekt hängt von anderen Bibliotheken ab, die wiederum von anderen Bibliotheken abhängen. Da Gradle nicht immer alle transitiven Abhängigkeiten erhält, müssen Sie möglicherweise in die Klasse schauen, die die Ausnahme auslöst. In meiner Version von Android Studio werden die Importe als fehlend markiert, wenn die Abhängigkeiten nicht hinzugefügt werden. Jetzt, da Sie die fehlenden Importe kennen, fügen Sie die erforderlichen Abhängigkeiten hinzu und Sie sind fertig.

1

Sie zwischen ClassNotFoundException unterscheiden müssen, was bedeutet, die Klasse einfach fehlt, und NoClassDefFoundError, die eine Reihe von Dingen bedeuten kann, wie z. B. dass die Klasse in dem falschen Paket für die Verzeichnisstruktur ist, in der es gefunden wurde. Überprüfen Sie, dass jxl.write.WritableFont in der JAR-Datei als /jxl/write/WritableFont.class vorhanden ist.

+0

ja es ist in dem mitgelieferten Glas vorhanden. –

+0

@be_bri Das habe ich nicht gesagt. Ich sagte, überprüfe, ob 'jxl.write.WritableFont' in der JAR-Datei * als' /jxl/write/WritableFont.class'* vorhanden ist. – EJP

Verwandte Themen