java classpath与import语句相关的查询

时间:2011-01-11 18:26:12

标签: java command-line classpath execution

我的程序名为Apple.java

import food.Fruit;
class Apple extends Fruit{
public static void main(String[] args){
    int y=20,z=0;
    z=y+10;
    System.out.println("x+y is "+z);
}
}

这是另一个名为Fruit.java的程序

 package food;
 public abstract class Fruit{
    public static void main(String[] args){
    int x=10;
    System.out.println("x is "+x);
    }
 }

这两个程序都存储在以下目录路径中: - G:\ Java \ food 我使用以下命令成功编译了两个程序: -

G:\>javac Java\food\*.java

它生成了类文件。 我确实设法使用以下命令执行Fruit程序: -

G:\>java -classpath G:\Java food.Fruit

但是,当我尝试对Apple程序执行相同操作时,会导致错误消息。

G:\>java -classpath G:\Java food.Apple
Exception in thread "main" java.lang.NoClassDefFoundError: food/Apple (wrong name: Apple)

有人可以帮我弄清楚错误是什么吗?我正在努力为SCJP证书考试做好准备,因此我将这个例子反馈给Kathy Sierra和Bert Bates撰写的McGrawHill出版书。


编辑#2

是的,我这样做是因为这就是代码在书中的表现。有没有办法我仍然可以执行该文件而无需包含package语句。

这就是问题所在:

  1. 尝试编译这两个文件。如果你想使用Apple类,请制作    确保将Fruit.class文件放在food子目录中。

  2. 编辑#3

    我确实尝试过,并收到以下错误

    G:\>java -classpath G:\Java\food Apple
    Exception in thread "main" java.lang.NoClassDefFoundError: food/Fruit
        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)
    Caused by: java.lang.ClassNotFoundException: food.Fruit
        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)
        ... 12 more
    Could not find the main class: Apple.  Program will exit.
    

    编辑#4

    我确实设法执行它而不必包含该语句     包装食品;

    G:\>java -classpath G:\Java\food;G:\Java Apple
    x+y is 30
    

    我改变的是我将Apple.class文件移动到一个单独的文件夹,这是有道理的,因为文件夹“food”是包的指示,并且Darvis指出文件夹中所有文件需要具有包名称,否则它不会执行。


    编辑#5 这也很有效。

    G:\>java -classpath G:\Java Apple
    x+y is 30
    

1 个答案:

答案 0 :(得分:2)

因为您没有为此指定食品包装。使它像这样,它将工作

package food;
import food.Fruit;
class Apple extends Fruit{
public static void main(String[] args){
    int y=20,z=0;
    z=y+10;
    System.out.println("x+y is "+z);
}
}

<强>更新

执行以下

G:\>java -classpath G:\Java food.Apple
Exception in thread "main" java.lang.NoClassDefFoundError: food/Apple (wrong name: Apple)

它会在类路径中添加G:\Java,它将相对搜索食物DIR 中的类apple,其中包名称为food

或者。如果您不想在课程中指定包,那么

G:\>java -classpath G:\Java\food Apple