所以我需要在我的Android项目中使用jexcelApi。包含它后,我没有编译器错误,但我的设备上的运行时异常 NoClassDefFoundError 我从该jar使用的每个类。反编译它表明所需的类在jar中。
我做了以下步骤:
compile fileTree(include: ['*.jar'], dir: 'libs')
在我的gradle构建脚本中完整的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
仍然得到相同的例外......
答案 0 :(得分:1)
你需要区分ClassNotFoundException
,这意味着该类只是缺失,而NoClassDefFoundError
,这可能意味着许多事情,例如该类在目录的错误包中找到它的结构。检查JAR文件中jxl.write.WritableFont
是否为/jxl/write/WritableFont.class
。
答案 1 :(得分:-1)
所以我找到了解决方案。
虽然我的问题在尝试了另一个lib之后神奇地消失了,然后放弃了这些更改并再次使用jexcelApi,我在这里找到了解决方案:About noClassDefFoundError。
再次讨论传递依赖:您的项目依赖于其他依赖于其他库的库。由于gradle并不总是获得所有传递依赖项,因此您可能需要查看抛出异常的类。在我的Android studio版本中,如果未添加依赖项,则会将导入标记为缺失。现在您已经知道缺少的导入,添加所需的依赖项,您就完成了。