遇到一个有趣的问题 我跑的时候:
$cd /projects/MyProject/
$java -cp . S3Sample
这很好用。但是如果我跑:
$java -cp /projects/MyProject /projects/MyProject/S3Sample
Error: Could not find or load main class .projects.MyProject.S3Sample
为什么会这样。快速浏览一下,找不到答案。谢谢!
答案 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
方法的类的完全限定名称。 (启动器会将/
替换为.
)。该类需要位于类路径中。参数不是文件的路径。