【问题标题】:NoClassDefFoundError though .jar is correctly includedNoClassDefFoundError 虽然正确包含 .jar
【发布时间】:2016-09-07 12:14:52
【问题描述】:

所以我需要将 jexcelApi 用于我的 Android 项目。包含它之后,我没有收到编译器错误,但是我的设备上的运行时异常 NoClassDefFoundError 对于我从该 jar 中使用的每个类。反编译显示需要的类在jar里面。

我做了以下步骤:

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

完整的 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 链接,我通过

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

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

仍然遇到同样的异常...

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @be_bri 我不是这么说的。我说'检查jxl.write.WritableFont是否存在于JAR文件中作为/jxl/write/WritableFont.class
    【解决方案2】:

    所以我找到了我的解决方案。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2013-10-15
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多