java.lang.NoClassDefFoundError錯誤解決

1參考文獻
文獻1:http://topic.csdn.net/u/20070812/16/b24350b6-3db4-4f7e-9861-1a113f53adff.html
文獻2:http://doc.linuxpk.com/4703.html
2錯誤描述
javac helloworld.java能夠通過。但是java helloworld出現錯誤:

[cpp] view plaincopy
hadoop@xuwei-erplab:~/jarfile$ java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/xuwei/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: HelloWorld. Program will exit.
3問題解決
在文獻1中很多人提到都是因爲環境變量classpath配置錯誤。說是沒有加上當前路徑"."。但是我查看了自己的classpath爲
[cpp] view plaincopy
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
這表明我的classpath配置是正確的。這個時候我找到了文獻2,裏面提到了helloword分爲帶包名和不帶包名兩類。
4不含包層次的HelloWorld.java
[java] view plaincopy
public class HelloWorld {
public static void main(String args[]){
System.out.println("Hello World!");
}

}
保存在/home/hadoop/jarfile下,使用javac命令編譯:
[cpp] view plaincopy
$ javac HelloWorld.java
運行:
[java] view plaincopy
$ java HelloWorld
屏幕打印出:
  Hello World!

5初學者常犯的錯誤
5.1. 運行時,帶了.class後綴
如果你試圖使用如下命令:(下面的命令都是假設在HelloWorld.java所在目錄執行,即/home/hadoop/jarfile)
[cpp] view plaincopy
java HelloWorld.class
  系統會誤認爲你運行的是HelloWorld包下的名爲class的類文件,會到系統的CLASSPATH下(一般都包括當前目錄)企圖尋找 HelloWorld.class.class這樣的類,這樣的類當然不存在了;並且也不可能存在,因爲class是關鍵字,不能作爲一個類的名字。所以會報如下錯誤信息:
  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class
5.2. 文件名大小寫錯誤
  對於像Windows這樣的系統,編譯時可以不關心大小寫(linux區分大小寫)。比如編譯HelloWorld.java時,也可以使用:
[cpp] view plaincopy
javac helloworld.java
  也可以編譯通過,但產生的類文件仍然是和源文件相符的:HelloWorld.class。但在運行時一定要注意大小寫,比如試圖使用如下命令運行:
[cpp] view plaincopy
java helloworld
  將報類似於1中的錯誤:
  Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)
6包含包層次的HelloWorld.java
  比如上面的HelloWorld.java修改如下:
[cpp] view plaincopy
package org.myorg;

public class HelloWorld {
public static void main(String args[]){
System.out.println("Hello World!");
}
}
  編譯時有兩種方法
6.1. 直接編譯
[cpp] view plaincopy
javac HelloWorld.java
  此時在當前目錄下輸出HelloWorld.class。此時,運行不能使用上面相同的方法,使用:
[cpp] view plaincopy
java HelloWorld
  運行時,出現如下錯誤:
  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/myorg/HelloWorld)
  從上述錯誤信息你也可以看到,系統可以找到HelloWorld類(因爲當前路徑包含在CLASSPATH中,具體爲什麼會提示wrong name,有興趣的朋友參見Java語言規範),但這個類屬於org.myogr包。所以,你要做的就是按照上述包層次,相應的創建目錄層次,把上面生成的HelloWorld.class放到/home/hadoop/jarfile/org/myorg目錄下。HelloWorld.java在/home/hadoop/jarfile/目錄下。運行: 
[cpp] view plaincopy
java org.myorg.HelloWorld
系統打印出:
 Hello World! 

這兒要注意的是,不能使用java org\myorg\HelloWorld來運行,此時同樣會出現如下錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError :org\myorg\HelloWorld (wrong name: org\myorg\HelloWorld)
  是不是有點怪怪的,那沒辦法。以後對Java的包有更深的認識時,就會明白了。
6.2. 使用 -d <directory>編譯選項
  是不是覺得上面的編譯方法有點麻煩,能不能自動在當前路徑(或任意指定的路徑)下生成包層次呢?有!使用-d <directory>編譯選項就能做到。
[cpp] view plaincopy
javac -d . HelloWorld.java
  此時,在當前目錄(/home/hadoop/jarfile)下就生成了一個org\myorg目錄(/home/hadoop/jarfile/org/myorg),並且輸出的.class文件也在裏面。運行:
[cpp] view plaincopy
java org.myorg.HelloWorld
系統打印:

Hello World!

  如果你想把生成的類文件集中存放在一個目錄中,比如:/home/hadoop/jarfile/test下,那麼你首先創建這個目錄,然後編譯時:

[cpp] view plaincopy
javac -d /home/hadoop/jarfile/test HelloWorld.java
  就可以把生成的類文件放到/home/hadoop/jarfile/test目錄下,並且按照包層次相應的創建目錄路徑。你可以在/home/hadoop/jarfile/test/org/myorg下找到HelloWorld.class文件。此時使用如下命令可以正確運行(注意如果要用到其它類,請在CLASSPATH中設好):

[cpp] view plaincopy
hadoop@xuwei-erplab:~/jarfile/test$ java org.xuwei2.HelloWorld
注意上述命令是在/home/hadoop/jarfile/test下執行的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章