0

我确定我误解了 Java 语言规范中的某些内容,但我不知道是什么。我的问题是:在许多系统上,java 强制目录结构并行包名,即如果包名是 foo.bar,那么包文件应该驻留在文件夹 foo/bar 中。但是,这不是 Java 语言规范的一部分,被认为是可选的。那么,如果您在一个执行这些规则的平台上有一个 Java 实现,而另一个没有执行这些规则,该怎么办?需要文件层次结构的实现是否能够在其他实现使用的非结构化包中找到文件?Java 是否总是递归搜索所有类路径中的类文件?如果是这样,那为什么需要包名来模仿目录结构呢?

编辑:例如,假设我们有两个 java 文件 one.java 和 two.java。在这些文件的顶部,我们预先添加“package foo.bar;” 因此将这些文件标记为包 foo.bar。现在,大多数 Java 实现将使我们将这些文件放入文件层次结构中,以便我们拥有 /foo/bar/one.java 和 /foo/bar/two.java。但是,根据 JLS,这不是必需的。现在,假设我们有一个 Java 实现,它不强制我们将它们放在一个层次结构中。也就是说,我们有一个 .jar 文件,它在顶级目录中有内容 one.java 和 two.java。现在,如果我们将该 .jar 文件加载到依赖文件层次结构来定位类文件的系统中,它是否能够找到这些类文件?

编辑:所以,经过一些实验,我发现如果你通过 jar cvf foo.jar one.class two.class 设置没有适当目录层次结构的包,然后你尝试将它们导入为 foo.bar.two 和foo.bar.one 即使指定了包,它也不起作用——你会得到一个 NoClassDefFoundError。考虑到http://docs.oracle.com/javase/tutorial/java/package/managingfiles.html说,这对我来说是一个非常有趣的结果,“Java 平台的许多实现依赖于分层文件系统来管理源文件和类文件,尽管 Java 语言规范不要求这样做。”

简而言之,这意味着如果您正在处理决定使用分层目录结构来管理包(几乎是所有包)的 Java 实现,那么生成的 jar 文件可能与其他不兼容的系统不兼容。以同样的方式实施。Java 社区似乎已经按照惯例解决了这个问题,但如果有任何其他信息,我很想听听更多。

4

1 回答 1

1

但是,使用该系统打包的 jar 文件与使用文件系统层次结构设置的 jar 文件不兼容,因为 java 不知道在哪里查找。

我将其视为实际问题,这是不正确的。JAR 文件是一个独立于平台的实体,基于 ZIP 格式,无论平台是否有目录,它都可以在内部拥有目录。

于 2013-10-01T01:54:30.023 回答