[java]路径加载导致的NoClassDefFoundError

最近帮个好朋友看代码,在我的电脑运行成功,在朋友电脑运行以后报NoClassDefFoundError。在linux环境下运行失败,在windows环境下运行成功。因为我运行正常于是以为是环境问题,于是检查了jdk,classpath等变量,网上也找了大量资料,都没什么用。什么windows和linux的/t/n换行区别用dos2unix试过,不行。检查文件编码file -i *.java检查,都是utf-8编码,有个us-ascii编码那也是不包含中文linux自动转为这个编码,问题也不大。到底是什么原因导致的两个系统的区别呢。

[java]路径加载导致的NoClassDefFoundError

最后面实在没办法才从源码去看(按照java对自身的可移植性定义,在windows下运行,在linux下应该一样能运行啊,所以没怀疑源码),但恰恰就是源码出了问题。

朋友处于学习阶段,需要看大量的代码,这是个坦克大战的小软件,网上的资源良莠不齐,有好些错误都是人为的编码的问题。

在centos中编译运行

[java]路径加载导致的NoClassDefFoundError

很快就出现以下错误,无法找到缺省字节码文件,不能初始化BombTank类(坦克被击中爆炸的类)

[java]路径加载导致的NoClassDefFoundError

去TankWar.Bullets.hitTank方法149行看看

[java]路径加载导致的NoClassDefFoundError

去看看BombTank,无法初始化说明是在构造的时候出的问题,检查变量定义和构造函数,最后发现是作者路径写错了(这样的错误还有好几处)

[java]路径加载导致的NoClassDefFoundError

目录关系

[java]路径加载导致的NoClassDefFoundError

没错Images写成images,大小写的低级错误。更改了以后终于调试正常

[java]路径加载导致的NoClassDefFoundError

所以说从网上学习别人的例子,github上面也有好多的失败代码,需要耐心和扎实的理论基础。问题解决,但是要想想为什么Windows就能正确的加载图片资源而忽略大小写呢。

于是我查了eclipse的配置文件

[java]路径加载导致的NoClassDefFoundError

无关!再次检查了环境变量和依赖$JAVA_HOME $CLASSPATH

无关!,查了源码(作者源码使用Toolkit加载)

[java]路径加载导致的NoClassDefFoundError

检查是否有忽略路径大小写的配置方法

无关!一度陷入死局

后来发现在cmd下

[java]路径加载导致的NoClassDefFoundError

没错 目录名叫Images 但是使用了cd images一样进去了

linux下

[java]路径加载导致的NoClassDefFoundError

还是linux严谨啊,问题出在window和linux路径管理的不同上,到此,真像大白!

顺带说下****有个bug:微软输入法无法在发布博客的时候添加新分类输入中文