android导入第三方包所遇到的NoClassDefFoundError错误

原文地址:http://blog.csdn.net/mad1989/article/details/7619136

最近开发项目需要从google地图转换到高德地图,所以在原有工程的基础上,只需要导入高德地图的包即可,代码大致和google的一样。但是导入后,eclipse下不会提示错误,但是在模拟器执行的时候就会报错:NoClassDefFoundError错误。


先给出网上对此错误的提示:
---------------------------------------------------------------------------------------

Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

1、在工程下新建lib文件夹,将需要的第三方包拷贝进来。
2、将引用的第三方包,添加进工作的build path。
3、(关键的一步)将lib设为源文件夹。如果不设置,则程序编译可以通过,但运行的时候,会报:
     java.lang.NoClassDefFoundError
---------------------------------------------------------------------------------------

一般我们导第三方包的步骤都是,右键工程----build path -configure build path 。在弹出的libraries里,我们选择 Add External JARs,然后选择导入包即可。(或新建一library-userlibrary)这样应该就不会有什么错误了,但是点击RunAs时,有时又会触发  conversion to dalvik format failed with error 错误。

看一下网上对此错误的提示:
---------------------------------------------------------------------------------------------------------------------------

    在eclipse开发Android项目时出现的很多问题都可以使用Project--------->clean来轻易解决。

    但如果出现说Android库找不到,或者不小心remove了Android系统库,怎么重新添加Android系统库呢?
在eclipse里面的Java Build Path里面是没法添加例如Android 2.1这样定义好的系统库。而我尝试手动添加
SDK 文件夹里面的Android.jar,结果出现了Conversion to Dalvik format failed with error 1问题了。折腾了
一番后,很多网友都说用Project clean可以解决,但对我的情况来说,没有用处。
    在百度找到解决方法了:
    修改项目classpath文件,这让我明白了,直接从其他正常项目里面把
<!-- 注意,这个.classpath文件在eclipse工作空间的硬盘存放位置对应工程项目目录下面 -->

      <classpathentry kind="lib"   path ="自定义jar的地址" /> 
修改成

      <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
这样子刷新项目,Android系统库Android 2.1回来了,那个错误也解决了。

 --------------------------------------------------------------------------------------------------------------------------

    这几天又遇到这样的问题了,但是.classpath文件里面已经包含了上面的con Path,后来在论坛
(http://www.eoeandroid.com/thread-53880-1-1.html)上找到新方法:

    project -> properties -> android label, check a target from the project build target list
<!-- 这样有时候还是不能去掉错误,这时候注意,在进入project -> properties -> android后,下面有
一个is library项,把它勾上,再点击确定错误就OK了,我的错误就是这样解决的,一开始按照上面
以及后面的方法都解决不了,最后我看到有一个is library项,把它勾上再确定试一下OK,错误没了 -->


============================================================================


附:
上网上广为流传的解决方法:conversion to dalvik format failed with error 1的解决办法

 
android低版本工程(如1.5)放到高版本环境中(如2.2)可能会上述错误,解决方法如下: 

    1、如果不修改android sdk版本,则使用project clean 命令作用于某工程即可。 (该处理方式
只是在高版本中兼容了低版本工程,未真正意义上的升级) 

    2、如果修改android sdk版本,则需要以下几个步骤: 
       1) 修改SDK 
             选择工程,build path --> configure build path ---> library 删除引用的低版本SDK, 
             然后add External JARs,选择高版本SDK,OK,保存 

       2) 修改classpath文件 

             该文件可能存在该项: <classpathentry kind="lib"   path ="你所指定的高版本的地址" 
             把她修改成<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" /> 
       3) 修改AndroidManifest.xml 
             在AndroidManifest.xml文件中,application标签后添加<uses-sdk android:minSdkVersion="3"></uses-sdk> 
       4) 修改default.properties(很重要) 
              该文件最后一行(前面没用#的)target=android-3 该成target=android-8,保存。 
       再看看你的工程和新建的android 2.2的工程结构就一样了。
-------------------------------------------------------------------------------------------------------------------------------------------------------------


貌似这样做还真把这个错误给解决了,反正我把progect --properties--android 下的 is library够选上,果然错误就没了,可是运行起来还是会报错。

现在我才发现原来错误不是在eclipse里的build path内。

我尝试着修改了一下电脑java的环境变量,有了惊奇的发现:
在我的电脑的环境变量中,classpath 原本是空的,我添加了如下的变量:
.;C:\Program Files\Java\jdk1.5.0_17\lib;C:\Program Files\Java\jdk1.5.0_17\lib\tools.jar
尤其是开始的.;这个是最为重要的。
少了 < .; > 就造成巨大的差别
在沒有做任何设定之下 , 预设的CLASSPATH就是一个 . 
这个 . 代表 命令提示字元的当前目录 
没设定比设定错误还要好一点(对新手而言) , 只要 .class 在当前目录 , 还是可以执行程序的 

但是你若下了设定 
SET CLASSPATH=C:"j2sdk1.4.1_03"lib;C:"j2sdk1.4.1_03"lib"tools.jar; 
少了这个. 若你当前的目录却不是 C:"j2sdk1.4.1_03"lib , 就會发生NoClassDefFoundError 

正確的設定 
SET CLASSPATH=.;C:"j2sdk1.4.1_03"lib;C:"j2sdk1.4.1_03"lib"tools.jar; 
表示當前的目錄 , C:"j2sdk1.4.1_03"lib" , 以及 tools.jar 內的class都可以載入 。



事实证明,主要原因并不是classpath的问题,来到公司,用同样的方法尝试还是运行报错,仔细一想:两台电脑,除了操作系统,eclipse版本不一样,别的没什么不同,群里问了一下,突然发现不同的是ADT的版本,公司电脑上的是18版本,而我家里或别的同事能运行的都是16版本,恍然大悟,
搜索一下,故知道了真正的的原因:


       最新的ADTandroid导入第三方包所遇到的NoClassDefFoundError错误_第1张图片都会自动生成一个Referenced Libraries,这个里面自动导入程序libs里的第三方jar包,或是手动在build path里添加的本地第三方jar包的路径。有了这个,程序运行就不会报错,这个是自动生成的,如果导入包后没有生成,clean或重新启动eclipse一下就会出现,自动关联。(无论是程序libs下还是本地路径下)。


网上搜索给出的原因:
------------------------------------------------------------------------------------------------------------------------------------------------------
http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

关于这个问题,下面我截的这几个图能更容易地说清楚:

android导入第三方包所遇到的NoClassDefFoundError错误_第2张图片


从左到右三个图分别是:
1.我的ADT16版的工程(三个截图的细节图标有些不一样,因为第一个是Windows的Eclipse下截的图,而另两个是在Mac的Eclipse下截的)
2.我修复前的ADT17版工程
3.我修复后的ADT17版工程


从中我们可以看到:
1.蓝色方框中的内容变化,是由新版补丁引起的(后面详细说明)
2.红色方框的内容变化,是我做的修复工作的结果


我所做的修复工作如下:
1.从标准的Java编译路径中移除第三方JAR包
    在工程名称上点右键 > Properties > Java Build Path > Libraries标签 >移除Android SDK之外的所有第三方JAR包
2把JAR包所在的文件夹名称从“lib”修改为“libs”
    这样做之后,ADT能自动找到所有在libs文件夹下的JAR包,把他们加到工程的依赖路径中,并直接显示在Android Dependecies分类下。
3.清理整个工程(可能需要也可能不用)
4.完成修复,可以正常运行了


导致此问题的原因,是新版的ADT管理JAR包的方式发生成变化,旧版支持两种不同的JAR包引用(一是Android工程的库,另一个是标准的库),新版则把这两者合并到Android Dependencies下了。


另外,新增加的annotations.jar提供了新的优化提示功能(更新信息请参阅http://tools.android.com/recent/ignoringlintwarnings)


除了这个小问题,新版的ADT17看起来很不错,我也很喜欢新的优化检查功能。


【更新】
开发团队DroidUX找到另一个解决此问题的办法,我没有亲自测试,但看起来应该也行得通,内容如下:


嗨,各位:

下面是问题的解决办法:

如果你引用了不在libs目录下的第三方JAR文件,比如你用了“classpath”变量,你可以通过导出引用来解决ADT17下报NoClassDefFoundError错误的问题。

导出引用的步骤:只需要转到“Properties > Java Build Path > Order and Export”,然后把你想要导出引用的全部勾选上就可以了。

祝顺利!

——DroidUX团队



http://blog.csdn.net/kongre/article/details/6946924 传送门  android使用第三方jar包,明天在csdn博客总结时附带上此文相关信息。

你可能感兴趣的:(android导入第三方包所遇到的NoClassDefFoundError错误)