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

标签 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

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

最佳答案

我有这个文件夹结构:

- 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)

长话短说

确保始终指定类的全名。检查你的类是否属于一个包。指定要执行的类的路径与写类的全名是一样的,java程序会将/替换为..

关于命令行上的java相对路径与绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24266526/

相关文章:

linux - 在 Bash 中将多个用户输入添加到一个变量中

java - 在 CLASSPATH 中具有 Jar 的终端中编译 Java 代码

java - 初级 Java - 循环数组

java - 写一个算法来找到最大值

java - 停止运行 for 循环,直到我收到 onClickListener 的响应

sorting - unix排序与混合数字和非数字不一致

c - OCIlib 库.c : No such file or directory

java - 静态方法或 getter 上的 Bean 验证列表<?>

java - 如何从 Eclipse 中的注释处理器加载类?

java - IntelliJ IDEA : How can I make sources of dependent libraries to be available in classpath on compilation?