错误描述
javac helloworld.java 能够通过。但是 java helloworld 出现错误 :
hadoop@xuwei-erplab : ~/java $ java helloworld 스레드 "main"java.lang.noclassdeffounderror : helloworld (잘못된 이름 : org/xuwei/helloworld) at java.lang.classlass1 (기본 메소드) (Defineclass1) java.lang.classloder.defineclasscond (classloader.java:631)의 java.lang.classloader.defineclass (classloader.java:615)의 java.security.secureclassloader.defeNeclass (secureclass.java:141) 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) java.security.accesscontroller.doprivileged (java.net.urlclassloader.findclass (urlclassloader.java:190)의 java.lang.classloader.loadclass (classLoader.java:306) at sun.misc.launcher $ appclassloader.loadclass (java.lang.classloader.loadclass (classloader.java:247)는 메인 클래스를 찾을 수 없습니다 : Helloworld. 프로그램이 종료됩니다.
2在文献 <br /> 在文献 1 中很多人提到都是因为环境变量 classpath 配置错误。说是没有加上当前路径 "."。但是我查看了自己的 classpath 为
复制代码代码如下 :
Export ClassPath =. : $ java_home/lib/tools.jar : $ java_home/lib/dt.jar : $ classPath
ClassPath 配置是正确的。这个时候我找到了文献 2, 里面提到了 Helloword 分为带包名和不带包名两类。
3 d helloworld.java
공개 클래스 HelloWorld {public static void main (String args []) {System.out.println ( "Hello World!");}}保存在/home/hadoop/jarfile 下, 使用 javac 命令编译 :
复制代码代码如下 :
$ javac helloworld.java
运行 :
复制代码代码如下 :
$ Java Helloworld
屏幕打印出 :
안녕하세요 세상!
4 、初学者常犯的错误
4.1. 运行时 运行时, 带了 .class 后缀如果你试图使用如下命令 : (下面的命令都是假设在 helloworld.java 所在目录执行, 即/home/hadoop/jarfile) 빗습니다.
复制代码代码如下 :
Java Helloworld.class
系统会误认为你运行的是 helloworld 包下的名为 class 的类文件 的类文件 的类文件 的类文件 的类文件, 会到系统的 classPath 下 下 下 下 下 下 下 용고) 企图寻找 helloworld.class.class 这样的类 这样的类, 这样的类当然不存在了;并且也不可能存在 这样的类当然不存在了;并且也不可能存在, 因为 클래스 是关键字, 不能作为一个类的名字。所以会报如下错误信息 : :
스레드의 예외 "main"java.lang.noclassdeffounderror : helloworld/class
4.2. 文件名大小写错误 文件名大小写错误 文件名大小写错误 Windows 对于像 对于像, 编译时可以不关心大小写 (Linux 区分大小写) 。比如编译 HelloWorld.java 时, 也可以使用 : :
复制代码代码如下 :
Javac Helloworld.java
也可以编译通过 也可以编译通过, 但产生的类文件仍然是和源文件相符的 : helloworld.class 。但在运行时一定要注意大小写 。但在运行时一定要注意大小写, 比如试图使用如下命令运行 :
复制代码代码如下 :
Java Helloworld
将报类似于 1 : :
스레드의 예외 "main"java.lang.noclassdeffounderror : helloworld (잘못된 이름 : Helloworld)
5 d 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
运行时 运行时, 出现如下错误 :
스레드의 예외 "main"java.lang.noclassdeffounderror : Helloworld (잘못된 이름 : org/myorg/helloworld)
从上述错误信息你也可以看到, 系统可以找到 helloworld 类 (因为当前路径包含在 classpath 中 中, 具体为什么会提示 具体为什么会提示 잘못된 이름, 有兴趣的朋友参见 java 语言规范)) 具体为什么会提示 但这个类属于 org.myogr 包。所以, 你要做的就是按照上述包层次, 相应的创建目录层次, 相应的创建目录层次 helloworld.class 放到/home/hadoop/jarfile/org/myorg 目录下。hellowld.java 在/home/hadoop/jarfile/테.
复制代码代码如下 :
java org.myorg.helloworld
系统打印出 :
안녕하세요 세상!
这儿要注意的是 这儿要注意的是, 不能使用 java org/myorg/helloworld 来运行, 此时同样会出现如下错误 :
스레드 예외 "main"java.lang.noclassdeffounderror : org/myorg/helloworld (잘못된 이름 : org/myorg/helloworld)
是不是有点怪怪的 是不是有点怪怪的, 那没办法。以后对 java 的包有更深的认识时, 就会明白了。
5.2. -D
复制代码代码如下 :
Javac -D. helloworld.java
"
复制代码代码如下 :
java org.myorg.helloworld
系统打印 :
안녕하세요 세상!
如果你想把生成的类文件集中存放在一个目录中 如果你想把生成的类文件集中存放在一个目录中 :/홈/hadoop/jarfile/test 下, 那么你首先创建这个目录, 然后编译时 : :
复制代码代码如下 :
javac -d/home/hadoop/jarfile/test helloworld.java
就可以把生成的类文件放到/home/hadoop/jarfile/test 目录下, 并且按照包层次相应的创建目录路径。你可以在/home/home/hadoop/jarfile/test/org/myorg 下找到 helloworld.class 文件。此时使用如下命令可以正确运行 文件。此时使用如下命令可以正确运行 文件。此时使用如下命令可以正确运行 文件。此时使用如下命令可以正确运行 文件。此时使用如下命令可以正确运行 文件。此时使用如下命令可以正确运行 (注意如果要用到其它类, 请在 classpath 中设好) :
复制代码代码如下 :
hadoop@xuwei-erplab : ~/jarfile/test $ java org.xuwei2.helloworld
注意上述命令是在/home/hadoop/jarfile/test 下执行的。
如果不行可以参考下面的方法 :
第二个问题解决方法 :
这是因为 jdk k, 我装的是 OpenJDK, 会出现 jar 包的缺失 包的缺失, 导致启动报错, 所以这里需要更换为 Oracle 官方给出的 jdk
1 官方下载一个这样的包 Oracle acle : JDK-7U79-LINUX-X64.TAR.GZ
2 移动到, ,/usr/local/java 目录下
3 /: Vim /etc /profile, 文件最后添加下面几行
复制代码代码如下 :
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
내보내기 경로 = $ 경로 : $ java_home/bin
4 再启动 再启动, , tomcat, 发现还会报错 : Java_home 또는 JRE_HOME 환경 변수는 정의되지 않습니다.
Tomcat at jdk 的环境变量
5 中 tomcat 、修改 bin 目录的 catalina.sh 文件 文件, 在文件的开头, 加入下面代码 : :
复制代码代码如下 :
java_home =/usr/local/java/jdk1.7.0_79 /// 实际的 jdk 路径 내보내기
jre_home =/usr/local/java/jdk1.7.0_79/jre 내보내기
tomcat, 日志打印正常, 浏览器也能够访问, 问题解决
스레드의 예외 "main"java.lang.internalerror
at sun.security.ec.sunec.initialize (기본 방법)
at sun.security.ec.sunec.access $ 000 (sunec.java:49)
at sun.security.ec.sunec $ 1.Run (Sunec.java:61)