通过命令行运行java代码时出现异常

时间:2010-05-02 04:48:12

标签: java

我有一个简单的类

package chapter10;

public class CompilationTest {


  public static void main(String[] args) {
    System.out.println("HELLO WORLD");
  }

}

路径是

Test\src\chapter10\CompilationTest.java

我成功将代码编译到同一个文件夹中,现在我已经

Test\src\chapter10\CompilationTest.class

但是,当我尝试从同一个文件夹运行时,我收到此错误

>java CompilationTest


Exception in thread "main" java.lang.NoClassDefFoundError: CompilationTest (wrong name: chapter10/CompilationTest)
        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: CompilationTest.  Program will exit.

当我使用

运行时
>java chapter10/PropertiesTest

Exception in thread "main" java.lang.NoClassDefFoundError: chapter10/PropertiesTest
Caused by: java.lang.ClassNotFoundException: chapter10.PropertiesTest
        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: chapter10/PropertiesTest.  Program will exit.

2 个答案:

答案 0 :(得分:7)

该类位于chapter10包中。从父目录运行它:

java chapter10.CompilationTest

转到父级的原因是Java正在为包含chapter10文件的CompilationTest.class目录搜索其包含当前目录的CLASSPATH。您还可以将src目录的绝对路径添加到CLASSPATH以实现相同的效果:

set CLASSPATH=C:\...\Test\src
java chapter10.CompilationTest

或者(显然这是更好的样式)将-cp或-classpath参数添加到java:

java -cp "C:\...\Test\src" chapter10.CompilationTest

答案 1 :(得分:4)

使用java chapter10.PropertiesTest运行。 Java命令需要完全限定的Java类名,不是字节码文件的路径名。

Java命令通过查看类路径来查找要加载的类。这是要按顺序搜索的目录或JAR文件的列表。使用的算法大致如下:

  1. 取该类的完全限定名称,替换“。”带有适用文件分隔符的字符(例如“/”或“\”),并在末尾附加“.class”。结果是路径名。

  2. 对于类路径中的每个条目,查找相对于条目的路径名。

    1. 如果查找成功,请加载相应的文件。
    2. 否则,继续下一个类路径条目。
  3. 如果没有查找成功,请抛出ClassNotFoundException

  4. 可以使用显式命令行参数(-cp <path>)设置类路径,也可以从CLASSPATH环境变量中选择它。如果这些方法中没有设置类路径,则默认类路径为“。”。假设,“。”表示当前目录。

    正如@BalusC所说,最佳做法是使用“-cp”参数或创建包装器脚本来启动应用程序。依赖你的shell的$ CLASSPATH是有点不好意思,因为你永远不知道什么时候它可能被覆盖或重置。

    (这是一个简化的描述。它不包括“bootclasspath”,在可加载的JAR文件中设置的类路径,从URL加载类,如何处理内部/匿名类等等。)