在嵌套的jar包中出现NoClassDefFoundError错误(Android)

6
我创建了一个简单的应用程序来测试出现“NoClassDefFoundError”错误的情况。
例如,我有一个名为Test1的Android项目,其中包含TestClass类和一些方法。我将该Test1项目导出为test1.jar,并仅导出源文件夹、TestClass类所在的classpath和.project文件夹。
在另一个名为Test2的Android项目中,我将此test1.jar添加到libs文件夹中。这个Test2项目中有一个Test2Class类,它调用test1.jar类的方法。
之后,我按照上述步骤将Test2项目导出为test2.jar文件。
因此,当我在另一个项目中使用这个test2.jar文件时,我会遇到“NoClassDefFoundError”错误。这就是嵌套jar的场景。
我需要做些什么才能访问嵌套在jar文件中的jar文件呢?
谢谢!

我认为错误出在项目文件上。删除它并检查,如果可以的话请告诉我它是否有效。 - Pankaj Arora
因为 .project 文件有旧路径,所以我遇到了相同的问题,在经过一些搜索后了解了这个情况。 - Pankaj Arora
2
第三个项目必须同时使用 test1.jartest2.jar 作为依赖项。 - ToYonos
创建jar文件时,不要包含.project文件。 - Pankaj Arora
@Dev,是的,我尝试过在创建JAR文件时不包括.project文件,但仍然出现了NoClassDefFoundError错误。 - Naveen Kumar
显示剩余3条评论
4个回答

3

按照以下步骤操作:
1. 删除所有library项目,然后进行清理。
2. 进入第一个工程Test1,右键点击“属性” ->“Android”,勾选Is Library(将其设置为library)。
3. 进入第二个工程Test2,右键点击“属性” ->“Android”,在“Library”部分选择Add -> 将第一个工程添加为库。
4. 进入第二个工程Test2,右键点击“属性” ->“Android”,同样勾选Is Library
5. 进入第三个工程project C,右键点击“属性” ->“Android”,在“Library”部分选择Add -> 添加第一和第二个工程作为库。(不要将Proj C设置为库)
6. 现在清理所有内容并运行Proj C
编辑: 您还可以查看此bugBug 405212 - Do not pack jars bundled inside a packed jarBug 361628 - Nested jars cannot be unpacked with Java 1.7。尝试以上方法,应该可以解决问题。


如果你想为这个bug应用补丁,你可以查看 这里。同样可以参考eclipse 帮助页面的补丁应用指南 - Mohammed Ali

0
尝试这样做:
进入项目/属性/Java构建路径/顺序和导出 - 确保Android依赖项和支持库(如果使用)前面有一个勾选框。
选中所有复选框,然后单击应用并清理项目。

0

从Java构建路径中删除JAR文件。添加名为“libs”的新文件夹,并将所有JAR文件放入该文件夹中。应用程序将正常运行。


1
我仍然遇到了NoClassDefFoundError错误。 - Naveen Kumar
抱歉回复晚了。我在试图调用test2.jar方法中test1.jar内的类的方法时,遇到了NoClassDefFoundError异常。 - Naveen Kumar
test2.jar中的类与test1.jar中的类相同,反之亦然。 - Amit Thaper
作为参考URL,为什么不调用TestAppMethods.testMethod2();而不是TestApp2Class.TestApp2Method();两者都会进行相同的调用。 - Amit Thaper
不,那个例子只是一个测试应用程序。基本上,我将在我的第二个jar中使用第一个jar的一些方法,并且我还有其他功能。为了实现这一点,我必须创建一个包装器。 - Naveen Kumar
显示剩余5条评论

0

这是不可能的。您需要解压缩JAR文件并将其添加到类路径中,以公开嵌套的JAR文件。参考Java bug

有几种处理它的适当方法的替代方案,例如this question建议使用One-jarUber jarShade

注意:这适用于Java,Andoid可能会有所不同,但似乎存在相同的问题。


那就这样了。你的意思是说它做不到。One-jar或Uber jar方法有点复杂,而且没有适当的教程。 - Naveen Kumar
不,它不能通过普通手段完成。要验证,请在Google中搜索“java嵌套的jar”,您会发现很多人都遇到了同样的问题。解决方法是解压缩zar并将它们添加为非嵌套或使用其他解决方案。 - Fredrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接