Java执行不使用-classpath

时间:2015-12-09 12:15:46

标签: java

Test.java

package test;

 import shape.twod.*;
 import shape.threed.*;
 import shape.*;

public class Test {

    /**
     * Creates a new instance of <code>Test</code>.
     */
     int o;
    public Test() {

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        ObjActions obj[] = new ObjActions[4];
        obj[0] = new Line(1,2,3,4);
        obj[1] = new Circle(1,2,3);
        obj[2] = new Line3D(1,2,3,4,5,6);
        obj[3] = new Sphere(1,2,3,4);
        for(ObjActions x: obj)
            x.draw();
        ObjActions.Actions2D o =(Circle)obj[1];
        //Actions2D o =(Circle)obj[1];
        System.out.println("Area of circle "+o.area());
        ObjActions.Actions3D op = (Sphere)obj[3];
        System.out.println("Volume of sphere "+op.volume());
    }
}

其位置为D:\Program\Javalearningprograms,所用包的位置为D:\Program\Javalearningprograms\PackageCheck

首先我用

编译它

javac -classpath .\PackageCheck -d .\ Test.java

它成功编译并在.\test中创建了Test.class,然后我使用了这个

java -classpath .\PackageCheck test.Test

得到Error: Could not find or load main class test.Test

所以我尝试了完整的路径:

java -classpath D:\Program\Javalearningprograms\PackageCheck\ test.Test

java -classpath D:\Program\Javalearningprograms\PackageCheck test.Test

仍然有Error: Could not find or load main class test.Test

然后检查天气.class文件有任何错误我将文件夹.\test移到了D:\Program\Javalearningprograms\PackageCheck并尝试了

来自java test.Test

D:\Program\Javalearningprograms\PackageCheck,程序成功运行

然后我将CLASSPATH环境变量设置为D:\Program\Javalearningprograms\PackageCheck并清理.class文件然后尝试

javac -classpath .\PackageCheck -d .\ Test.java它在.\test文件夹中创建了Test.class,而我使用了

java test.Test并且程序成功运行,我尝试了

java -classpath .\PackageCheck test.Test

java -classpath .\PackageCheck\ test.Test

java -classpath D:\Program\Javalearningprograms\PackageCheck test.Test

java -classpath D:\Program\Javalearningprograms\PackageCheck\ test.Test

得到Error: Could not find or load main class test.Test

我不知道为什么-classpath没有使用java命令,我做错了什么?

    Directory: D:\Program\Javalearningprograms\PackageCheck


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        09-Dec-15   1:35 PM                baseobj
d-----        09-Dec-15   1:35 PM                shape
-a----        09-Dec-15   1:33 PM            559 Circle.java
-a----        09-Dec-15   1:33 PM            566 Line.java
-a----        09-Dec-15   1:33 PM            627 Line3D.java
-a----        09-Dec-15   1:32 PM            384 ObjActions.java
-a----        08-Dec-15   9:58 PM            340 Point.java
-a----        08-Dec-15   9:58 PM            302 Point3D.java
-a----        08-Dec-15  10:05 PM            343 PointTest.java
-a----        09-Dec-15   1:33 PM            547 Sphere.java

3 个答案:

答案 0 :(得分:2)

因为Test.class不在类路径的目录中。

javac -classpath .\PackageCheck -d .\ Test.java

创建文件test\Test.class

但是使用您定义的类路径-classpath .\PackageCheck,在目录test\中找不到它。

将您的命令更改为

java -classpath .\PackageCheck;. test.Test

这将找到PackageCheck\以下的课程和当前目录。

编辑根据修正后的问题,PackageCheck\似乎只包含源文件。因此,所有生成的类文件将作为

存储在当前目录下
shape\twod\*.class
shape\threed\*.class
shape\*.class
test\*.class

使用java -cp . test.Test运行代码或将编译后的类存储到专用目录(必须在之前创建)javac -cp .\PackageCheck -d bin Test.java。然后,您可以使用java -cp bin test.Test运行代码。 (请记住删除已创建的类文件,以确保它们不会从错误的目录中获取。)

答案 1 :(得分:1)

请参阅http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html

  

默认的类路径是当前目录。 [...]使用-classpath命令行选项会覆盖默认值,因此如果要在搜索路径中包含当前目录,则必须包含“。”

这应该解释您所观察到的内容 - 默认情况下,您的课程位于test/Test.class但是只要添加-classpath选项,您就需要包含当前目录,例如

java -classpath .\PackageCheck;. test.Test

我移动test/Test.class目录下的PackageCheck文件,java再次能够找到它,即使当前目录不是类路径的一部分。请记住,-classpath选项定义了查找完全限定的java类的根路径 - 使用-classpath时,不再自动包含当前目录的详细信息。

答案 2 :(得分:0)

尝试以下

javac -d PackageCheck Test.java

和编译后

java -cp PackageCheck test.Test