在Android中使用Simple XML时出现NoClassDefFoundError错误

14

我正在尝试在我的Android应用程序中使用Simple XML将我的Java对象转换为XML格式。

在代码的某一行,我遇到了NoClassDefFoundError错误。

Serializer serializer = new Persister();

java.lang.NoClassDefFoundError: org.simpleframework.xml.core.Persister

在项目类路径中我有 simple-xml-2.6.1.jar,但当我遇到 NoClassDefFoundError 时,我也将这三个 jar 文件放入了类路径。

stax-1.2.0.jar

stax-api-1.0.1.jar

xpp3-1.1.3_8.jar

但是没有利用它。

仍然出现NoClassDefFoundError错误。

任何形式的帮助都将不胜感激。谢谢。


唯一可能的原因是您未将simple-xml-2.6.1.jar放入类路径中。我检查了Persister类,没有任何静态块,构造函数也很简单。 - Clark Bao
我使用 dedexer 将我的应用程序的 .dex 文件转换为 .class 文件,但是我无法看到 org.simpleframework 文件夹。这意味着 simpleXML jar 没有被放入我的 .apk 文件中。感谢您的启示。 - user831170
我手动将simple-xml-2.6.1.jar的所有源代码添加到我的项目中,我发现它可以正常工作。尝试找出为什么即使我将jar文件添加到项目的构建路径中,也无法运行其中的类。 - user831170
也许 simple-xml-2.6.1.jar 是由一个比 Android 无法重新编译的较低版本的 javac 编译的。 - Clark Bao
这对我来说刚刚开始发生,因为我升级了Android SDK和工具,所以我猜这与我的javac版本有关。 - Matt Gibson
6个回答

21
你在Build Path配置中是否勾选了“Order and Export”下的Simple XML?我刚刚更新了最新的SDKAndroid的Eclipse插件后,遇到了这个问题。之前已经成功使用Simple数月了。
不知为何,在更新后,我必须执行以下两步:
  • 勾选“Order and Export”下的simple-xml-2.6.2.jar
  • 清理我的项目 (重要)
执行了以上两步后,问题就消失了。

这个加上savemaxim的答案解决了问题。+1给所有人! :D - Hasani Blackwell
@kilonet 不确定您的意思。对我来说,它在产品中肯定运行良好。应用程序已在 Play 商店销售了 5000 份,而没有 Simple XML 就无法工作,因此我“假设”这个解决方案可行:D - Matt Gibson

6
我通过修改Java Build path解决了和你类似的问题。
我今天安装了Android DDMS 17.0.0.v201203161636-291853,出现了NoClassDefFoundError错误。
解决方法->选中simple-xml依赖项的复选框,并将其优先级高于yourproject/src/main/java。
请参考以下截图:enter image description here

2

您的类路径中不需要那三个其他的jar包。

确保您的类路径看起来像这样,并且将jar文件放在lib文件夹中(为了符合惯例):

项目构建路径

将库添加到构建路径中

添加到构建路径


我的类路径中有一个.jar文件。实际上,我将它放在另一个项目中,作为库项目使用。simple-xml-2-6.jar已经包含在我的项目中,并从另一个项目中调用。 - user831170
1
我认为更明智的做法是将jar包添加到项目的lib文件夹中,然后将其包含在构建路径中。不确定为什么在添加项目引用时它不起作用,但这似乎不是一种非常可移植的工作方式。 - Bram Vandenbussche
我从外部项目中提取了simpleXML jar并将其放入正在使用的项目中。情况仍然是一样的。我认为我错过了某些要点。谢谢。 - user831170
你把它加入到工程的类路径里了吗?可以右键点击 jar 文件,选择“添加到构建路径”选项。我已经在我的回答中附上了一张截图。 - Bram Vandenbussche
目前还没有合适的解决方案,我正在努力寻找。一旦找到,我会在这里发布并让大家知道,好吗? - user831170
显示剩余3条评论

0

你遇到这个错误可能是因为你没有在清单文件中声明任何活动。请按照以下方式将其添加到清单文件中:

 <activity android:name=".DatabaseActivity"></activity>

这里的DatabaseActivity是我的应用程序的活动。 试一下吧。

我认为这是一个回归基础的答案,我已经在我的清单中描述过了。谢谢。 - user831170

0

这有点奇怪,但对我来说有效。

Serializer serializer;        
Persister persiter = new Persister();
serializer = persiter;   

0

当您将应用程序部署到设备(或模拟器)时,是否会出现有关您尝试包含的jar的任何错误?并非所有的jar都适用于Android。旧代码可能会出现问题,您可能需要获取源代码并重新编译您感兴趣的jar。这可以确保字节码与Android兼容。我以前在一些jar中遇到过这个错误,但它们仍然可以正常工作,即使有错误。它们也与xml相关(不是SimpleXML)。


我会考虑这个问题。我已经搜索了一些关于将Java类转换为XML的信息,大多数建议使用SimpleXML。这就是为什么我试图找出这个错误的原因。谢谢。 - user831170
1
嗨,我使用了dom4j和jaxen。我编写了代码将对象序列化为xml,然后将其发送到我的appengine进行存储。反向操作也可以。这些库很容易使用。我并不是说你选择的库有问题,但是暂时切换到这些库可能会帮助你解决问题。 - Anthony Nolan

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