错误描述
javac helloworld.java 能够通过。但是 java helloworld 出现错误 :
Hadoop@xuwei-erplab: ~/jarfile $ java helloWorld Exception di utas "utama" java.lang.noclassdeffounderror: helloworld (nama yang salah: org/xuwei/helloworld) di java.lang.classloader.defineclass1 (Metode Asli) di AT AT) di AT Metode AT) di AT NIDFA) AT AT) AT ATIC) AT AT) AT NIDFA.LANG.LANG java.lang.classloader.defineclasscond (classloader.java:631) di java.lang.classloader.defineclass (classloader.java:615) di java.security.secureclasserer.defineclass (SecureCLass.SecureClasser.defineClass (SecureClass (SecureCLASSLASSLASS (SecureCLASSLASS.DEFINEClass ( java.net.urlclassloader.defineclass (urlclassloader.java:283) di java.net.urlclassloader.access $ 000 (urlclassloader.java:58) di java.net.urlclassloader $ 1.run (urlclaskLlasse.net.urlClassLoader $ 1.run (URLCLASCLACLLOBLACE. java.security.accesscontroller.doprivileged (metode asli) di java.net.urlclassloader.findclass (urlclassloader.java:190) di java.lang.classloader.loadclass (classloader.java:306) di sun.misc.launcher $ appclassloader.loadClass (peluncur.java:301) di java.lang.classloader.loadClass (classloader.java:247) tidak dapat menemukan kelas utama: HelloWorld. Program akan keluar.
2 、问题解决<br /> 在文献 1 中很多人提到都是因为环境变量 classpath 配置错误。说是没有加上当前路径 "." 。但是我查看了自己的 classpath 为
复制代码代码如下:
Ekspor classpath = .: $ java_home/lib/tools.jar: $ java_home/lib/dt.jar: $ classpath
这表明我的 ClassPath 配置是正确的。这个时候我找到了文献 2 , 里面提到了 Helloword 分为带包名和不带包名两类。
3 、不含包层次的 HelloWorld.java
kelas publik helloWorld {public static void main (string args []) {System.out.println ("Hello World!");}}保存在/HOME/HADOOP/JARFILE 下 , 使用 Javac 命令编译 :
复制代码代码如下:
$ javac helloworld.java
运行 :
复制代码代码如下:
$ java helloworld
屏幕打印出 :
Halo dunia!
4 、初学者常犯的错误
4.1. 运行时 , 带了 .class 后缀如果你试图使用如下命令 :(下面的命令都是假设在 helloworld.java 所在目录执行 , 即/home/hadoop/Jarfile)
复制代码代码如下:
java helloworld.class
系统会误认为你运行的是 HelloWorld 包下的名为 Kelas 的类文件 , 会到系统的 ClassPath 下(一般都包括当前目录)企图寻找 HelloWorld.class.Class 这样的类 , 这样的类当然不存在了;并且也不可能存在 , 因为 kelas 是关键字 , : :
Pengecualian di Thread "Main" java.lang.noclassdeffounderror: HelloWorld/Class
4.2. 文件名大小写错误 对于像 windows 这样的系统 , 编译时可以不关心大小写 (linux 区分大小写) 。比如编译 helloworld.java 时 , 也可以使用 :
复制代码代码如下:
javac helloworld.java
也可以编译通过 , : : helloworld.class 。但在运行时一定要注意大小写 , 比如试图使用如下命令运行 :
复制代码代码如下:
Java Helloworld
将报类似于 1 中的错误 :
Pengecualian di Thread "Main" java.lang.noclassdeffounderror: HelloWorld (Nama Salah: HelloWorld)
5 、包含包层次的 HelloWorld.java
比如上面的 helloworld.java : :
Paket org.myorg; kelas publik HelloWorld {public static void main (string args []) {System.out.println ("Hello World!");}}编译时有两种方法
5.1. 直接编译复制代码代码如下:
javac helloworld.java
此时在当前目录下输出 helloworld.class 。此时 , 运行不能使用上面相同的方法 , : :
复制代码代码如下:
Java Helloworld
运行时 , : :
Pengecualian di Thread "Main" java.lang.noclassdeffounderror: HelloWorld (nama salah: org/myorg/helloworld)
从上述错误信息你也可以看到 , 系统可以找到 helloworld 类(因为当前路径包含在 classpath 中 , 具体为什么会提示 nama salah , 有兴趣的朋友参见 java 语言规范) , 但这个类属于 org.myogr 包。所以 , , , 相应的创建目录层次 , 把上面生成的 helloworld.class 放到/homeop/hadoop/Jarfile/org/myorg 目录下。Helloworlorlord.java ~ homfile/org/org/myorg 目录下。helloworldorld.java ~ home/home/home/home/home/hom/hom/hom/hom/org
复制代码代码如下:
java org.myorg.hellorld
系统打印出 :
Halo dunia!
这儿要注意的是 , 不能使用 Java org/myorg/helloworld 来运行 , :
Pengecualian di Thread "Main" java.lang.noclassdeffounderror: org/myorg/helloworld (nama salah: org/myorg/helloworld)
是不是有点怪怪的 , 那没办法。以后对 Java 的包有更深的认识时 , ,
5.2. 使用 -D <Rectory> 编译选项 是不是觉得上面的编译方法有点麻烦 , 能不能自动在当前路径(或任意指定的路径)下生成包层次呢?有!使用 -D <Rectory> 编译选项就能做到。
复制代码代码如下:
Javac -D. Helloworld.java
此时 , 在当前目录 (/home/hadoop/jarfile) 下就生成了一个 org/myorg 目录 (/home/hadoop/jarfile/org/myorg) , .class 文件也在里面。运行 :
复制代码代码如下:
java org.myorg.hellorld
系统打印 :
Halo dunia!
如果你想把生成的类文件集中存放在一个目录中 , : :/home/hadoop/jarfile/tes 下 , 那么你首先创建这个目录 , : :
复制代码代码如下:
javac -d/home/hadoop/jarfile/test helloworld.java
就可以把生成的类文件放到/home/hadoop/jarfile/tes 目录下 , 并且按照包层次相应的创建目录路径。你可以在/home/hadoop/Jarfile/test/org/myorg 下找到 helloworld.class 文件。此时使用如下命令可以正确运行(注意如果要用到其它类 , 请在 classpath 中设好) :
复制代码代码如下:
HADOOP@XUWEI-ERPLAB: ~/Jarfile/Test $ Java org.xuwei2.helloworld
注意上述命令是在/home/hadoop/jarfile/tes 下执行的。
如果不行可以参考下面的方法 :
第二个问题解决方法 :
这是因为 JDK 的版本而产生的问题 , 我装的是 OpenJDK , 会出现 Jar 包的缺失 , 导致启动报错 , 所以这里需要更换为 Oracle 官方给出的 JDK
1 、去 Oracle 官方下载一个这样的包 : JDK-7U79-Linux-x64.tar.gz
2 、解压之后 , 移动到/usr/lokal/java 目录下
3 、添加环境变量 : vim /etc /profile , 文件最后添加下面几行
复制代码代码如下:
Ekspor java_home =/usr/local/java/jdk1.7.0_79 // 实际的 jdk 路径
Ekspor classpath = .: $ java_home/jre/lib/rt.jar: $ java_home/lib/dt.jar: $ java_home/lib/tools.jar
Path Ekspor = $ path: $ java_home/bin
4 、完成上述安装之后 , 再启动 tomcat , : : Baik variabel lingkungan java_home maupun jre_home didefinisikan
这个问题是因为 Tomcat 没有识别出 JDK 的环境变量
5 、修改 tomcat 中 bin 目录的 katalina.sh 文件 , 在文件的开头 , :
复制代码代码如下:
Ekspor java_home =/usr/local/java/jdk1.7.0_79 //// 实际的 jdk 路径
Ekspor jre_home =/usr/local/java/jdk1.7.0_79/jre
最后启动 tomcat , 日志打印正常 , 浏览器也能够访问 , 问题解决
Pengecualian di Thread "Main" Java.lang.internalerror
at sun.security.ec.sunec.initialize (metode asli)
di sun.security.ec.sunec.access $ 000 (sunec.java:49)
di sun.security.ec.sunec $ 1.run (sunec.java:61)