java中包语句的歧义

时间:2016-08-22 12:23:15

标签: java

请考虑以下代码:

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

如果我可以在没有目录层次结构的情况下编译,为什么我不能执行?

4 个答案:

答案 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)使用完整路径运行