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)