NoClassDefFoundError虽然正确包含了.jar

时间:2016-05-11 21:40:01

标签: java android android-studio jar android-gradle

所以我需要在我的Android项目中使用jexcelApi。包含它后,我没有编译器错误,但我的设备上的运行时异常 NoClassDefFoundError 我从该jar使用的每个类。反编译它表明所需的类在jar中。

我做了以下步骤:

  1. 下载了jar
  2. 将其复制到{Root_Folder} / libs
  3. compile fileTree(include: ['*.jar'], dir: 'libs')在我的gradle构建脚本中
  4. 名为清洁项目
  5. 建立项目
  6. 完整的logcat条目:

    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')
    

    关注以下代码:

    // 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);
    

    我真的不知道,如何继续,请帮助我!提前谢谢。

    更新

    所以我发现,有些软件包具有传递依赖性,必须包含它们才能编译它们。 所以我找到了以下链接:

    首先说我需要compile 'log4j:log4j:1.2.14',第二说我需要

    compile 'org.slf4j:slf4j-api:1.7.2'
    compile 'org.slf4j:slf4j-log4j12:1.7.2'
    

    在Maven-link之后,我通过

    得到了相同的结果
    compile('net.sourceforge.jexcelapi:jxl:2.6.12') {
        transitive= true
    }
    

    使我在该任务上的依赖关系树如下所示: Dependency Tree

    仍然得到相同的例外......

2 个答案:

答案 0 :(得分:1)

你需要区分ClassNotFoundException,这意味着该类只是缺失,而NoClassDefFoundError,这可能意味着许多事情,例如该类在目录的错误包中找到它的结构。检查JAR文件中jxl.write.WritableFont是否为/jxl/write/WritableFont.class

答案 1 :(得分:-1)

所以我找到了解决方案。

虽然我的问题在尝试了另一个lib之后神奇地消失了,然后放弃了这些更改并再次使用jexcelApi,我在这里找到了解决方案:About noClassDefFoundError

  

再次讨论传递依赖:您的项目依赖于其他依赖于其他库的库。由于gradle并不总是获得所有传递依赖项,因此您可能需要查看抛出异常的类。在我的Android studio版本中,如果未添加依赖项,则会将导入标记为缺失。现在您已经知道缺少的导入,添加所需的依赖项,您就完成了。