java相对路径vs命令行上的绝对路径

时间:2014-06-17 14:32:41

标签: java unix classpath

遇到一个有趣的问题 我跑的时候:

$cd /projects/MyProject/
$java -cp . S3Sample

这很好用。但是如果我跑:

$java -cp /projects/MyProject /projects/MyProject/S3Sample
Error: Could not find or load main class .projects.MyProject.S3Sample

为什么会这样。快速浏览一下,找不到答案。谢谢!

3 个答案:

答案 0 :(得分:3)

我有这个文件夹结构:

- home
  - org
    - test
      + Foo.java
      + Foo.class

Foo.java中的代码是一个简单的hello world应用程序:

//Note the usage of the package statement here.
package org.test;

public class Foo {
    public static void main(String[] args) {
          System.out.println("Hello world");
    }
}

然后,在命令行中,为了执行Foo.class,我应该提供类的完整名称(我在cmd中的“/ home”文件夹中):

$ java -cp "org/test;." Foo
Exception in thread "main" java.lang.NoClassDefFoundError: Foo (wrong name: org/test/Foo)
$ java -cp "org/test;." org.test.Foo
Hello world

现在,我编辑上面的课程并删除package句子:

//no package specified
public class Foo {
    public static void main(String[] args) {
          System.out.println("Hello world");
    }
}

重新编译类并执行相同的命令行后:

$ java -cp "org/test;." Foo
Hello world
$ java -cp "org/test;." org.test.Foo
Exception in thread "main" java.lang.NoClassDefFoundError: org/test/Foo (wrong name: Foo)

TL; DR

确保始终指定班级的全名。检查您的类是否属于某个包。指定要执行的类的路径与编写类的全名相同,java程序将/替换为.

答案 1 :(得分:1)

你应该运行

$ java -cp /projects/MyProject S3Sample

类的路径已经是CLASSPATH-relative

答案 2 :(得分:1)

使用java,指定包含要执行的main方法的类的完全限定名称。 (启动器会将/替换为.)。该类需要位于类路径中。参数不是文件的路径。