我想知道为什么以下步骤正在发挥作用。
假设实际的文件结构是:
- src
- Toto.java
文件Toto.java
包含
package myPackage;
class Toto{}
将源文件排列在反映其包的目录树中 树。例如,如果所有源文件都在\ 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
不编译。
答案 0 :(得分:2)
原则上,您不需要将源文件放在与包层次结构匹配的树中。编译器将编译每个类并在内部存储包名。无论您如何组织源目录,每个生成的.class
文件都将知道它对应的包。
潜在的问题是,如果您正在编译多个类,那么其中一些类很可能会相互引用。当一个类引用另一个类时,编译器和JRE使用目录层次结构作为查找类的方法。默认情况下,编译器会将已编译的.class
文件放在与其Java源相同的目录中。如果源目录很糟糕,那么最终会得到一组.class
文件,这些文件本身并不是根据包构造的,这将使得很难找到它们。您仍然可以通过在javac
或java
命令行中仔细设置类搜索路径来解决问题 - 您是否真的想要这样做。
此外,如果使用-d <path>
为编译器指定目录,那么它将构造一个与包层次结构匹配的已编译类的树,但是这些源是混乱的。我不确定是否有人使用默认方法,将编译后的类放入与源相同的目录中,原则上,您可能构建一个相当复杂的多包Java应用程序,其中所有源文件都是在同一目录中 - 假设您可以跟踪它们。
尽管如此,源代码树与包层次结构匹配的想法在Java开发方法中已经牢固确立,无论它是否始终是严格必要的。像Ant和Maven这样的IDE工具和构建工具都假定这个组织,所以你必须有点血腥的工作才能以任何其他方式工作。