最近想用java做点东西,配置好jdk后,还是出现下面的异常:
Exception in thread "main " java.lang.NoClassDefFoundError
网上搜索了很多,发现基本上是说路径配置不对。
写完一个hello程序后,
开始编译:javac hello.java
运行:java hello
Exception in thread "main " java.lang.NoClassDefFoundError
难道路径不对吗,瞎折腾了很久,还试了加上jre的路径到环境变量,重新启动电脑,都没用。
我的配置如下:
JAVA_HOME - C:/Program Files (x86)/Java/jdk1.6.0_17
CLASSPATH - .;C:/Program Files (x86)/Java/jdk1.6.0_17/lib
在PATH变量最后加上 ;C:/Program Files (x86)/Java/jdk1.6.0_17/bin
没问题吧
网上的东西真是没几个准,最后发现自己的hello.java中使用了自定义包:pacakge com.hf.test,
才怀疑是包在作怪,终于搜索到一篇文章http://topic.youkuaiyun.com/t/20050708/12/4131400.html,其中12楼的回答
基本解决了我的问题,有兴趣的可以参考下。
下面是我的解答步骤:
我的当前路径是d:/java, hello.java放在d:/java/com/hf/test下面,
编译: javac com/hf/test/hello.jva
运行: java com.hf.test.hello
OK
然后我将它又打包成jar文件,这里将编译的class文件归到一起,所以采用如下步骤:
当前路径还是d:/java
创建clsses目录: mkdir classes
编译: javac -d classes com/hf/test/hello.jva // -d 指定编译出的class文件输出到classes目录中
运行:cd classes //cd到classes目录下运行
java com.hf.test.hello
OK
打jar包:
cd到classes目录下,用记事本创建一个manifest文件,内容 如下,保存时注意选择文件类型为*.*, 名字可自定义。
Manifest-Version: 1.0
Main-Class: com.hf.test.hello
Created-By: 1.2.2 (Sun Microsystems Inc.)
这是主要是要指定Main-Class,其它的没啥关系,这里指定你的main()方法所在类的完整路径: com.hf.test.hello
可惜的是,直接copy参考的那篇文章的manifest是会出问题的,照样出同样的异常。后来发现,
原来Main-Class: 这一行格式不对,真是折腾啊
原因是Main-Class: 后需要空一格,再加上类的路径。多一个tab格也会出问题的,真晕!
好了,然后开始打包:
cd classes
jar -cvfm my.jar manifest com/hf/test
这样,jar包就打好了
执行:java -jar my.jar
ok
如果你的jar包是被其它程序使用,可以用java命令的-cp参数导入。
到此,一切o了
总结:一个简单的问题,却很折腾人,网上的东西五花八门,真正是自己思考的太少了。
为避免自己以后忘掉,作此。欢迎指教。