为什么javac接受使用包含错误树结构的包声明来编译类

时间:2017-10-18 11:47:07

标签: java package javac

我想知道为什么以下步骤正在发挥作用。

假设实际的文件结构是:

 - src
  - Toto.java

文件Toto.java包含

package myPackage;
class Toto{}

official javac specification

  

将源文件排列在反映其包的目录树中   树。例如,如果所有源文件都在\ workspace中,那么   将com.mysoft.mypack.MyClass的源代码放在/ workspace中   \工作空间\ COM \ mysoft \ mypack \ MyClass.java。

我以为

$ cd src
$ javac Toto.java

将输出错误。 相反,编译器不会产生错误并编译正确的文件。

显然,

cd src
javac PokerQ/Affichage.java

javac PokerQ/Affichage.java

不编译。

1 个答案:

答案 0 :(得分:2)

原则上,您不需要将源文件放在与包层次结构匹配的树中。编译器将编译每个类并在内部存储包名。无论您如何组织源目录,每个生成的.class文件都将知道它对应的包。

潜在的问题是,如果您正在编译多个类,那么其中一些类很可能会相互引用。当一个类引用另一个类时,编译器和JRE使用目录层次结构作为查找类的方法。默认情况下,编译器会将已编译的.class文件放在与其Java源相同的目录中。如果源目录很糟糕,那么最终会得到一组.class文件,这些文件本身并不是根据包构造的,这将使得很难找到它们。您仍然可以通过在javacjava命令行中仔细设置类搜索路径来解决问题 - 您是否真的想要这样做。

此外,如果使用-d <path>为编译器指定目录,那么它将构造一个与包层次结构匹配的已编译类的树,但是这些源是混乱的。我不确定是否有人使用默认方法,将编译后的类放入与源相同的目录中,原则上,您可能构建一个相当复杂的多包Java应用程序,其中所有源文件都是在同一目录中 - 假设您可以跟踪它们。

尽管如此,源代码树与包层次结构匹配的想法在Java开发方法中已经牢固确立,无论它是否始终是严格必要的。像Ant和Maven这样的IDE工具和构建工具都假定这个组织,所以你必须有点血腥的工作才能以任何其他方式工作。