Java 包结构与文件夹结构

Java package structure versus folder structure

我见过的所有 Java 项目都使用遵循包结构的文件夹结构。这导致我有大量不包含任何文件的文件夹。

因此,例如包以 com.mydomain.mysystem.myutility 开头。这将导致文件夹 src\comsrc\com\mydomainsrc\com\mydomain\mysystem 不包含任何文件。 myutility 很可能也只包含文件夹。

很可能还会有一个包含名称 myutility 的项目文件夹,因此完整的文件夹路径可能是 myutility\src\main\java\com\mydomain\mysystem\myutility\otherfolder

这种做法很常见,但它让我们想知道它有多大用处。与不创建这些额外文件夹的情况相比有什么好处?使用例如 myutility\src\main\java\otherfolder

它似乎同样有效,但它为每个人节省了额外的导航步骤。我可以用这两种方法编译 Java 源文件。

在项目中,通常所有源代码都在 com\mydomain\mysystem 中。将这些 'empty' 文件夹放在所有项目中有什么好处?

澄清一下,我并不是在质疑包结构的有用性。 Maven 也很清楚。

问题是为什么我们使用在组织的整个存储库中通常相同的空文件夹。

之所以这样做,是为了防止冲突,保证类能够被唯一标识。这意味着如果 2 类 具有相同的名称,它们仍然可以通过不同的导入加载。

最安全的方法是使用域名,该域名本质上是唯一的:

例如

com.google.<classname>

您的方法可行并会保存一些空文件夹,但不可扩展。

源文件(和class)的组织方式是这样的,以便Java编译器(和运行时间环境)可以找到它们。

当 Java 编译器编译你的 class 时,它需要你的 class 所依赖的每个 class 的源文件或 class 文件,所以它可以检查 class 是否存在,是否使用正确的参数调用了所有方法,等等。另外,如果它找到了一个源文件而不是 class 文件,或者如果 class文件比源文件旧,它将编译您使用的 class 的源文件。

编译器当然可以只检查您的class路径的所有子文件夹,甚至整个磁盘,但这会花费很多时间。由于此约定,编译器只需为每个 classpath 条目检查一个子文件夹。当然你可以想出不同的解决方案来解决这个问题,但(当时)Sun 的人认为这是最好的选择。

当然,以上也适用于运行时加载的class个文件,所以class个文件也存储在类似的文件夹结构中。

另请注意,Java 应用程序和库通常打包为 Jar 文件(基本上是内部具有相同文件夹结构的 zip 文件),因此在许多情况下它们在文件系统。