【问题标题】:Class resides in different directory than what the package specifies - how come?类驻留在与包指定的目录不同的目录中 - 为什么?
【发布时间】:2011-01-26 21:45:01
【问题描述】:

以下陈述似乎令人不安:

robert@neghvar:~/tmp> cat org/foo/Bar.java 
public class Bar {

}

robert@neghvar:~/tmp> javac org/foo/Bar.java 
robert@neghvar:~/tmp> javap org.foo.Bar
Compiled from "Bar.java"
public class org.something.Bar extends java.lang.Object{
    public org.something.Bar();
}

虽然 Bar 类文件在org/foo 目录下并声明了org.something 包,但编译器并没有报错。我的印象是 java 要求遵循包名称的目录层次结构。我弄错了吗?如果是这样,混淆包名的后果是什么?

【问题讨论】:

    标签: java package javac


    【解决方案1】:

    源目录结构不需要遵循包命名(尽管它几乎总是按照惯例。)

    认为 Sun/Oracle javac、javap、java等。工具(以及我知道的所有其他 Java 实现)是每个包名称组件规则(以及默认类加载器)的子目录。我找不到任何权威的东西,但这似乎不是 Java 语言规范的要求:

    【讨论】:

    • 很好的答案,也感谢您的研究。似乎没有实现需要它 - 我的示例是使用 Oracle 的 javacjavap 完成的。
    • “需要”是指这些工具生成包组织并在运行时需要它。 (javac/javap 程序不需要它的源文件。)关键是语言(和 JVM)规范不需要子目录组织,但所有标准 java 工具实现都需要。
    • 他们还需要在编译时使用它来编译依赖类。如果你编译了一些其他依赖于 Bar 的类并且 Bar 没有被编译,如果 Bar.java 不在正确的位置,编译将会失败。
    【解决方案2】:

    这纯粹是约定俗成的。编译器将使用包名。

    话虽如此,打破这种约定通常不是一个好主意。这会导致不一致(生成的类将在包后面的目录中)和一些混乱!

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 2018-06-18
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多