错误描述
javac helloworld.java 能够通过。但是 java helloworld : :
Hadoop @ xuwei-erplab: ~ / jarfile $ java helloworld exception dans le thread "main" java.lang.noclassdeffounderror: helloworld (mauvais nom: org / xuwei / helloworld) à java.lang.classload. java.lang.classloader.defineclasscond (classloader.java:631) sur java.lang.classloader.defineclass (classloader.java:615) sur java.security.secureclassloader.defineclass (seculecloder.java:141) à la java.net.urlclassloader.defineclass (urlclassloader.java:283) sur java.net.urlclassloader.access $ 000 (urlclassloader.java:58) à java.net.urlclassloader java.security.accessController.Doprivileged (méthode native) sur java.net.urlclassloader.findclass (urlclassloader.java:190) sur java.lang.classloader.loadclass (classloader.java:306) à Sun.Misc.laper $ AppClassload. java.lang.classloader.loadclass (classloader.java:247) n'a pas pu trouver la classe principale: helloworld. Le programme sortira.
2 、问题解决<Br /> 在文献 1 中很多人提到都是因为环境变量 CLASSPATH 配置错误。说是没有加上当前路径 "." 。但是我查看了自己的 CLASSPATH 为
复制代码代码如下:
export classpath =.: $ java_home / lib / outils.jar: $ java_home / lib / dt.jar: $ classpath
这表明我的 ClassPath 配置是正确的。这个时候我找到了文献 2 , 里面提到了 Helloword 分为带包名和不带包名两类。
3 、不含包层次的 Helloworld.java
classe publique Helloworld {public static void main (String args []) {System.out.println ("Hello World!");}}保存在 / Home / Hadoop / Jarfile 下 , 使用 Javac 命令编译 :
复制代码代码如下:
$ javac helloworld.java
:
复制代码代码如下:
$ java helloworld
:
Bonjour le monde!
4 、初学者常犯的错误
4.1. 运行时 , 带了 .Classe 后缀如果你试图使用如下命令 : 下面的命令都是假设在 下面的命令都是假设在 Helloworld.java 所在目录执行 , 即 / home / hadoop / jarfile))
复制代码代码如下:
java helloworld.class
系统会误认为你运行的是 Helloworld 包下的名为 Classe 的类文件 , 会到系统的 CLASSPATH 下 (一般都包括当前目录) 企图寻找 Helloworld.class.class 这样的类 , 这样的类当然不存在了;并且也不可能存在 , 因为 Classe 是关键字 , : : : :
Exception dans Thread "Main" java.lang.noclassdeffounderror: helloworld / classe
4.2. 文件名大小写错误 对于像 Windows 这样的系统 , 编译时可以不关心大小写 (Linux 区分大小写) 。比如编译 Helloworld.java 时 , :
复制代码代码如下:
javac helloworld.java
也可以编译通过 , 但产生的类文件仍然是和源文件相符的 : Helloworld.class 。但在运行时一定要注意大小写 , 比如试图使用如下命令运行 :
复制代码代码如下:
Java Helloworld
将报类似于 1 中的错误 :
Exception dans Thread "Main" Java.lang.NoclassdeffoundError: Helloworld (mauvais nom: 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 dans le fil "Main" java.lang.noclassdeffounderror: helloworld (mauvais nom: org / myorg / helloworld)
从上述错误信息你也可以看到 , 系统可以找到 Helloworld 类 (因为当前路径包含在 ClassPath 中 , 具体为什么会提示 Mauvais nom , 有兴趣的朋友参见 Java 语言规范) , 但这个类属于 org.myogr 包。所以 , 你要做的就是按照上述包层次 , 相应的创建目录层次 , 把上面生成的 Helloworld.class 放到 / home / hadoop / jarfile / org / myorg 目录下。heloworld.java 在 / home / hadoop / jarfile / 目录下。运行 目录下。运行 :helloworld.
复制代码代码如下:
java org.myorg.heloworld
:
Bonjour le monde!
这儿要注意的是 , 不能使用 Java org / myorg / helloworld 来运行 , : :
Exception dans le fil "Main" java.lang.noclassdeffounderror: org / myorg / helloworld (mauvais nom: org / myorg / helloworld)
是不是有点怪怪的 , 那没办法。以后对 Java 的包有更深的认识时 , 就会明白了。
5.2. 使用 -d <répertoire> 编译选项 是不是觉得上面的编译方法有点麻烦 , 能不能自动在当前路径 (或任意指定的路径)) 下生成包层次呢?有!使用 -d <répertoire> 编译选项就能做到。
复制代码代码如下:
Javac -d. Helloworld.java
此时 , 在当前目录 (/ home / hadoop / jarfile) 下就生成了一个 org / myorg 目录 (/ home / hadoop / jarfile / org / myorg) , 并且输出的 .class : :
复制代码代码如下:
java org.myorg.heloworld
:
Bonjour le monde!
如果你想把生成的类文件集中存放在一个目录中 , 比如 : / Home / Hadoop / Jarfile / Test 下 , 那么你首先创建这个目录 , : :
复制代码代码如下:
javac -d / home / hadoop / jarfile / test helloworld.java
就可以把生成的类文件放到 / home / hadoop / jarfile / test 目录下 , 并且按照包层次相应的创建目录路径。你可以在 / home / hadoop / jarfile / test / org / myorg 下找到 helloworld.class 文件。此时使用如下命令可以正确运行 (注意如果要用到其它类 , 请在 Chemin de classe 中设好):
复制代码代码如下:
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 / profil , 文件最后添加下面几行
复制代码代码如下:
exporter 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 / outils.jar
Export Path = $ Path: $ java_home / bin
4 、完成上述安装之后 , 再启动 Tomcat , 发现还会报错 : Ni la variable Java_Home ni la variable d'environnement JRE_HOME n'est définie
这个问题是因为 Tomcat 没有识别出 JDK 的环境变量
5 、修改 Tomcat 中 Bin 目录的 Catalina.sh 文件 , 在文件的开头 , : :
复制代码代码如下:
Exporter java_home = / usr / local / java / jdk1.7.0_79 //// 实际的 jdk 路径
exporter jre_home = / usr / local / java / jdk1.7.0_79 / jre
最后启动 Tomcat , 日志打印正常 , 浏览器也能够访问 , 问题解决
Exception dans Thread "Main" java.lang.internalerror
à Sun.security.ec.sunec.Initialize (méthode native)
à Sun.Security.E.Sunec.Access $ 000 (sunc.java:49)
à Sun.Security.E.Sunec 1 $.