程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Exception in thread main java.lang.NoClassDefFoundError毛病處理辦法

Exception in thread main java.lang.NoClassDefFoundError毛病處理辦法

編輯:關於JAVA

Exception in thread main java.lang.NoClassDefFoundError毛病處理辦法。本站提示廣大學習愛好者:(Exception in thread main java.lang.NoClassDefFoundError毛病處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Exception in thread main java.lang.NoClassDefFoundError毛病處理辦法正文


毛病描寫
javac helloworld.java可以或許經由過程。然則java helloworld湧現毛病:

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.

2、成績處理
在文獻1中許多人提到都是由於情況變量classpath設置裝備擺設毛病。說是沒有加受騙前途徑"."。然則我檢查了本身的classpath為


export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

這注解我的classpath設置裝備擺設是准確的。這個時刻我找到了文獻2,外面提到了helloword分為帶包名和不帶包名兩類。
3、不含包條理的HelloWorld.java

public class HelloWorld {
	public static void main(String args[]){
		System.out.println("Hello World!");
	}
}

保留在/home/hadoop/jarfile下,應用javac敕令編譯:

$ javac HelloWorld.java  

運轉:

$ java HelloWorld 

屏幕打印出:
  Hello World!

4、初學者常犯的毛病
4.1. 運轉時,帶了.class後綴
        假如你試圖應用以下敕令:(上面的敕令都是假定在HelloWorld.java地點目次履行,即/home/hadoop/jarfile)


java HelloWorld.class 

體系會誤以為你運轉的是HelloWorld包下的名為class的類文件,會到體系的CLASSPATH下(普通都包含以後目次)妄圖尋覓 HelloWorld.class.class如許的類,如許的類固然不存在了;而且也弗成能存在,由於class是症結字,不克不及作為一個類的名字。所以會報以下毛病信息:
  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class
4.2. 文件名年夜小寫毛病
  關於像Windows如許的體系,編譯時可以不關懷年夜小寫(linux辨別年夜小寫)。好比編譯HelloWorld.java時,也能夠應用:


javac helloworld.java

也能夠編譯經由過程,但發生的類文件依然是和源文件符合的:HelloWorld.class。但在運轉時必定要留意年夜小寫,好比試圖應用以下敕令運轉:

java helloworld 

將報相似於1中的毛病:
  Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)
5、包括包條理的HelloWorld.java
  好比下面的HelloWorld.java修正以下:

package org.myorg;

public class HelloWorld {
	public static void main(String args[]){
		System.out.println("Hello World!");
	}
}

編譯時有兩種辦法
5.1. 直接編譯

javac HelloWorld.java 

  此時在以後目次下輸入HelloWorld.class。此時,運轉不克不及應用下面雷同的辦法,應用:

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/目次下。運轉: 

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的包有更深的熟悉時,就會明確了。
5.2. 應用 -d <directory>編譯選項
  是否是認為下面的編譯辦法有點費事,能不克不及主動在以後途徑(或隨意率性指定的途徑)下生成包條理呢?有!應用-d <directory>編譯選項就可以做到。

javac -d . HelloWorld.java 

  此時,在以後目次(/home/hadoop/jarfile)下就生成了一個org\myorg目次(/home/hadoop/jarfile/org/myorg),而且輸入的.class文件也在外面。運轉:

java org.myorg.HelloWorld 

體系打印:

Hello World!

  假如你想把生成的類文件集中寄存在一個目次中,好比:/home/hadoop/jarfile/test下,那末你起首創立這個目次,然後編譯時:

javac -d /home/hadoop/jarfile/test HelloWorld.java 

  便可以把生成的類文件放到/home/hadoop/jarfile/test目次下,而且依照包條理響應的創立目次途徑。你可以在/home/hadoop/jarfile/test/org/myorg下找到HelloWorld.class文件。此時應用以下敕令可以准確運轉(留意假如要用到其它類,請在CLASSPATH中設好):


hadoop@xuwei-erplab:~/jarfile/test$ java org.xuwei2.HelloWorld 

留意上述敕令是在/home/hadoop/jarfile/test下履行的。

假如不可可以參考上面的辦法:

第二個成績處理辦法:

這是由於JDK的版本而發生的成績,我裝的是OpenJDK,會湧現JAR包的缺掉,招致啟動報錯,所以這裡須要改換為Oracle官方給出的JDK

1、去Oracle官方下載一個如許的包:jdk-7u79-linux-x64.tar.gz
2、解壓以後,挪動到/usr/local/java目次下
3、添加情況變量:vim   /etc/profile,文件最初添加上面幾行


export JAVA_HOME=/usr/local/java/jdk1.7.0_79   //現實的JDK途徑
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

4、完成上述裝置以後,再啟動Tomcat,發明還會報錯:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

這個成績是由於Tomcat沒有辨認出JDK的情況變量

5、修正Tomcat中bin目次的catalina.sh文件,在文件的開首,參加上面代碼:


export JAVA_HOME=/usr/local/java/jdk1.7.0_79  ////現實的JDK途徑
export JRE_HOME=/usr/local/java/jdk1.7.0_79/jre

最初啟動Tomcat,日記打印正常,閱讀器也可以或許拜訪,成績處理

Exception in thread "main" java.lang.InternalError
        at sun.security.ec.SunEC.initialize(Native Method)
        at sun.security.ec.SunEC.access$000(SunEC.java:49)
        at sun.security.ec.SunEC$1.run(SunEC.java:61)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved