2017-10-18 42 views
1

我想知道为什么下面的步骤正在工作。为什么javac接受用不正确的树结构来编译包声明的类

比方说,实际的文件结构为:

- src 
    - Toto.java 

文件Toto.java包含

package myPackage; 
class Toto{} 

official javac specification状态

安排反映目录树的源文件的包 树。例如,如果所有源文件都位于\ workspace中,则 将com.mysoft.mypack.MyClass的源代码放置在/ workspace中,位于 \ workspace \ com \ mysoft \ mypack \ MyClass.java中。

我认为

$ cd src 
$ javac Toto.java 

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

显然,

cd src 
javac PokerQ/Affichage.java 

javac PokerQ/Affichage.java 

不进行编译。

回答

2

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

潜在的问题是,如果你编译多个类,那么这些类中的一些将最有可能互相引用。当一个类引用另一个类时,编译器和JRE使用目录层次结构作为找到类的一种手段。默认情况下,编译器将编译的.class文件放置在与其Java源相同的目录中。如果源目录是greglyy-piggledy,那么最终会生成一组.class文件,这些文件本身并不是根据软件包来构建的,这将很难找到它们。您可能仍然能够通过在您的javacjava命令行中仔细设置类搜索路径来解决问题 - 如果您真的想这样做。此外,如果您使用-d <path>指定编译器的目录,那么它将构造一个与包层次结构相匹配的编译类树,但是源代码会混杂在一起。我不确定是否有人使用默认方法,即将编译后的类放入与源相同的目录中,原则上可以构建一个相当复杂的多包Java应用程序,其中所有源文件都位于相同的目录 - 假设你可以跟踪它们。

尽管如此,源代码树与包层次结构相匹配的想法在Java开发方法论中坚定不移,无论它是否绝对必要。像Ant和Maven这样的IDE工具和构建工具都假定这个组织,所以你必须有点血腥,才能以其他方式工作。

相关问题