错误描述
javac helloworld.java 能够通过。但是 java helloworld 出现错误:
hadoop@xuwei-erplab: ~/jarfile $ java helloworld Exceção em thread "main" java.lang.noclassDeffoundError: helloworld (nome errado: org/xuwei/helloworld) em java.lang.classloader.defineclass1 (método nativo) java.lang.classloader.defineclassCond (classelloader.java:631) em java.lang.classloader.defineclass (classloader.java:615) at java.security.securreclassloader.definClass (scullload java.net.urlclassloader.defineclass (urlclassloader.java:283) em java.net.urlclassloader.access $ 000 (urlclassloader.java:58) em java.net.urlllassloader $ 1.RUn java.security.accessController.Doprivileged (método nativo) em java.net.urlclassloader.findclass (urlclassloader.java:190) em java.lang.classloader.loadclass (classloader.java:306) em Sun.misc.launcher $ appClassLoader.loadclass (lançador.java:301) em java.lang.classloadler.loadclass (classeLloader.java:247) não conseguiu encontrar a classe principal: helloworld. Programa sairá.
2 、问题解决 <r />在文献 1 中很多人提到都是因为环境变量 ClassPath 配置错误。说是没有加上当前路径 "." 。但是我查看了自己的 ClassPath 为
复制代码代码如下:
exportar classe de classe = .: $ java_home/lib/tools.jar: $ java_home/lib/dt.jar: $ ClassPath
这表明我的 Classpath 配置是正确的。这个时候我找到了文献 2 , 里面提到了 Helloword 分为带包名和不带包名两类。
3 、不含包层次的 helloworld.java
classe pública helloworld {public static void main (string args []) {System.out.println ("Hello World!");}}保存在/Home/Hadoop/Jarfile 下 , Javac 命令编译:
复制代码代码如下:
$ javac helloworld.java
运行
复制代码代码如下:
$ java helloworld
屏幕打印出
Olá mundo!
4 、初学者常犯的错误
4.1. 运行时 ,.
复制代码代码如下:
java helloworld.class
系统会误认为你运行的是 Helloworld 包下的名为 Classe 的类文件 , 会到系统的 Classpath 下 (一般都包括当前目录) 企图寻找 Helloworld.class.class 这样的类 , 这样的类当然不存在了;并且也不可能存在 , 因为 classe 是关键字 , 不能作为一个类的名字。所以会报如下错误信息:
Exceção no tópico "Main" java.lang.noclassDeffoundError: helloworld/classe
4.2. Windows 对于像 Windows 这样的系统 , 编译时可以不关心大小写 (Linux 区分大小写) 。比如编译 Helloworld.java 时 , 也可以使用:
复制代码代码如下:
javac helloworld.java
也可以编译通过 , 但产生的类文件仍然是和源文件相符的: helloworld.class 。但在运行时一定要注意大小写 , 比如试图使用如下命令运行:
复制代码代码如下:
Java Helloworld
将报类似于 1 中的错误:
Exceção no tópico "Main" java.lang.noclassDeffoundError: Helloworld (Nome errado: Helloworld)
5 、包含包层次的 helloworld.java
比如上面的 Helloworld.java 修改如下 ::
pacote org.myorg; classe pública helloworld {public static void main (string args []) {System.out.println ("Hello World!");}}编译时有两种方法
5.1. 直接编译复制代码代码如下:
javac helloworld.java
此时在当前目录下输出 Helloworld.class 。此时 , 运行不能使用上面相同的方法 , ::
复制代码代码如下:
Java Helloworld
运行时 , 出现如下错误:
Exceção no tópico "Main" java.lang.noclassDeffoundError: helloworld (nome errado: 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
系统打印出
Olá mundo!
这儿要注意的是 , Java org/myorg/helloworld 来运行 , 此时同样会出现如下错误:
Exceção no tópico "Main" java.lang.noclassDeffoundError: org/myorg/helloworld (nome errado: 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
系统打印
Olá mundo!
如果你想把生成的类文件集中存放在一个目录中 , 比如 :/home/hadoop/jarfile/teste 下 , 那么你首先创建这个目录 , 然后编译时:
复制代码代码如下:
javac -d/home/hadoop/jarfile/teste helloworld.java
就可以把生成的类文件放到/home/hadoop/jarfile/teste 目录下 , 并且按照包层次相应的创建目录路径。你可以在/home/hadoop/jarfile/teste/org/myorg 下找到 helloworld.class 文件。此时使用如下命令可以正确运行 (注意如果要用到其它类 , 请在 ClassPath 中设好))) 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好 中设好:
复制代码代码如下:
hadoop@xuwei-erplab: ~/jarfile/teste $ java org.xuwei2.helloworld
注意上述命令是在/home/hadoop/jarfile/teste 下执行的。
如果不行可以参考下面的方法
第二个问题解决方法
这是因为 Jdk 的版本而产生的问题 , 我装的是 OpenJdk , jar 包的缺失 , 导致启动报错 , 所以这里需要更换为 Oracle 官方给出的 jdk
1 、去 Oracle 官方下载一个这样的包: JDK-7U79-Linux-x64.tar.gz
2 、解压之后 , 移动到/usr/local/java 目录下
3 、添加环境变量: vim /etc /perfil , 文件最后添加下面几行
复制代码代码如下:
exportar java_home =/usr/local/java/jdk1.7.0_79 // 实际的 jdk 路径
exportar classe de classe = .: $ java_home/jre/lib/rt.jar: $ java_home/lib/dt.jar: $ java_home/lib/tools.jar
Caminho de exportação = $ caminho: $ java_home/bin
4 、完成上述安装之后 , 再启动 tomcat , 发现还会报错: nem a variável de ambiente java_home nem a JRE_HOME é definida
这个问题是因为 tomcat 没有识别出 jdk 的环境变量
5 、修改 tomcat 中 bin 目录的 catalina.sh 文件 , 在文件的开头 , 加入下面代码:
复制代码代码如下:
exportar java_home =/usr/local/java/jdk1.7.0_79 //// 实际的 jdk 路径
export jre_home =/usr/local/java/jdk1.7.0_79/jre
最后启动 Tomcat , 日志打印正常 , 浏览器也能够访问 , 问题解决
Exceção no tópico "Main" java.lang.internalError
no Sun.security.ec.sunec.initialize (método nativo)
em Sun.security.ec.sunec.access $ 000 (sunsec.java:49)
em Sun.security.ec.sunec $ 1.run (sunsec.java:61)