以下陈述似乎令人不安地起作用:
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要求一个跟在包名后面的目录层次结构。我弄错了吗?如果是这样,混合包名称的后果是什么?
答案 0 :(得分:3)
源目录结构不需要遵循包命名(即使它几乎总是遵循惯例。)
我认为 Sun / Oracle javac,javap,java等。工具(以及我所知道的所有其他Java实现)是每个包名称组件规则的子目录(以及默认的类加载器)。我找不到任何权威的东西,但它似乎不是Java语言规范的要求:
答案 1 :(得分:2)
这纯粹是惯例。编译器将使用包名称。
话虽如此,打破这个惯例通常不是一个好主意。它会导致不一致(生成的类将在包后面的目录中)并且有些混乱!