请考虑以下代码:
package com.a.b;
class Test {
public static void main(String[] args) {
System.out.println("Hello to the world of packages");
}
}
我编写了这样的程序:
javac Test.java
这在当前工作目录中创建了Test.class
文件。我该如何运行该程序?我试过了:
java Test
但是我得到了“No class def found error”。如果我这样编译:
javac -d . Test.java
它正在创建目录结构,然后我就可以运行
了java com.a.b.Test
如果我可以在没有目录层次结构的情况下编译,为什么我不能执行?
答案 0 :(得分:3)
在你的第一个命令中:
javac Test.java
它编译得很好,因为没有错误并将Test.class
文件放在当前目录中,因为那是Test.java
所在的位置,as per the documentation:
如果未指定 -d 选项,则
javac
会将每个类文件放在与生成它的源文件相同的目录中。
源文件位于当前目录中,因此类文件放在当前目录中。现在当你这样执行:
java Test
出现错误,因为必须使用完全限定的类名。您指定了一个包,即使它位于当前目录中,您仍然必须使用完全限定名称来指定它的位置。没有全名,Java无法找到它执行它,因此错误。您可以执行以下操作:
java com.a.b.Test
Java会找到它并且所有都可以正常运行。
现在,我建议使用-d
选项正确放置您的类文件以进行组织。我还建议实际创建您指定的软件包,因此请将Test.java
文件放在./com/a/b
目录中。
答案 1 :(得分:2)
您必须始终使用完全限定的类名运行Java程序:
使用include
选项编译它并不重要。
所以,在你的情况下,它将是:
javac -d
最佳做法是使用java com.a.b.Test
选项进行编译,并根据包名将.class文件存储在正确的目录结构中。
<强>更新强>
另外,请确保您当前的目录位于类路径中。
尝试运行:
-d
更新2
如果java -cp . com.a.b.Test
选项未与-d
一起使用,则会在当前目录中创建类文件。您必须手动将类文件移动/复制到相应的目录,然后执行它们。 javac
选项是实现此目标的捷径。
答案 2 :(得分:0)
Java搜索classpath
中的类。默认情况下,classpath
仅包含currrent目录。
当Java搜索类时,它会通过.class
元素进行迭代。如果element是目录,则在某个子目录中搜索具有类结束扩展名/
名称的文件。准确地说,通过将点重新映射到目录分离simbol(\
或{{1}},具体取决于您的操作系统)并解析结果,可以找到此子目录。
答案 3 :(得分:-1)
1)将您的类添加到java build-path 2)使用完整路径运行