遇到一个有趣的问题 当我运行时:
$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/