类存放在与包指定的目录不同的目录中 - 为什么?

时间:2011-01-26 21:45:02

标签: java package javac

以下陈述似乎令人不安地起作用:

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要求一个跟在包名后面的目录层次结构。我弄错了吗?如果是这样,混合包名称的后果是什么?

2 个答案:

答案 0 :(得分:3)

源目录结构不需要遵循包命名(即使它几乎总是遵循惯例。)

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

答案 1 :(得分:2)

这纯粹是惯例。编译器将使用包名称。

话虽如此,打破这个惯例通常不是一个好主意。它会导致不一致(生成的类将在包后面的目录中)并且有些混乱!