首页 > 语言与算法 > java命令行下运行class文件

java命令行下运行class文件

2010年2月15日 发表评论 阅读评论

今天碰到了一个很变态的问题,写了一个很简单的HelloWord.java,内容如下:
package com.yanjiuyanjiu;

public class HelloWorld {
public static void main(String args[]) {
System.out.println(“Hello World!”);
}
}

在eclipse中运行是可以的,但是在命令行下运行总是失败。我的工程位置为 d:\workspace\HelloWorld\。

尝试了很多次,如下

d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\>java HelloWorld

Exception in thread “main” java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HelloWorld.  Program will exit.
Exception in thread “main”

d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\>java -classpath .; HelloWorld
Exception in thread “main” java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HelloWorld.  Program will exit.
Exception in thread “main”

d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\>cd..

d:\workspace\HelloWorld\bin\com\>cd..

d:\workspace\HelloWorld\bin\>java -classpath .; com/yanjiuyanjiu/HelloWorld    只有这个成功

Hello World!

d:\workspace\HelloWorld\bin\>java -classpath .; com\yanjiuyanjiu\HelloWorld    换了个斜杠就不行了

Exception in thread “main” java.lang.NoClassDefFoundError: com\yanjiuyanjiu\HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com\yanjiuyanjiu\HelloWorld.  Program will exit.
Exception in thread “main”

d:\workspace\HelloWorld\bin\>java -classpath ./com/yanjiuyanjiu/; HelloWorld

Exception in thread “main”java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HelloWorld.  Program will exit.
Exception in thread “main”

在网上搜索了大半天,大部分说是环境 变量,classpath或JDK 版本的问题,还有执行时文件名 class后缀不要。我一一试过,都没有解决。最后无意中换了一下命令符的位置,成功了。总结如下:
1. 环境变量,CLASSPATH当然要设置好,执行时不要带class后缀;
2. 路径中的斜杠用“/”而不是“\”;
3. 命令符的当前目录要在包的起点。比如这里应该在 d:\workspace\HelloWorld\bin\>,如果在 d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\>,反而不行,有点“近水楼台不得月”的意思,不知 道为什么,还请高手解释一下。

分享到:
分类: 语言与算法 标签:
  1. sun_zhoupeng
    2011年5月18日02:36 | #1

    \是windows下的分隔符,/是unix,linux下的分隔符,可能是java的开发者是在unix平台下开发的编译器,所以采用了unix风格的路径分隔符。

  2. 逗你玩
    2011年6月17日07:34 | #2

    你用的是windows吧

  3. biaobiaoqi
    2011年10月5日21:36 | #3

    分割符的问题是很容易弄错的。
    不带class分割符容易理解的,它呼叫的是类,而不是文件。java命令的执行不是执行的当前文件,而是在classpath指令的目录下搜寻类。在sun的官方tutorial网页上,他有专门强调这一点的~
    命令符的当前目录要是包的起点,这一点官方网页上也有强调的~
    我也刚起步。到处搜索相关网页,找到这里~交流下,呵呵。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.