3

TFile依赖于 Java 6 上不可用的 java.nio.file.Path(toPath() 方法返回 java.nio.file.Path),因此在 Java 6 上调用任何 TFile 方法都会抛出“java.lang.NoClassDefFoundError: java/ nio/文件/路径”

您如何设法在 Java 6 上使用 TFile?我正在考虑的是获取源,在没有这种方法的情况下重新编译它们并使用修补版本,这是一种令人不快的解决方案。

4

1 回答 1

2

不,TrueZIP 7 不需要 JSE 7,JSE 6 作为主页文件就足够了。但是,某些功能仅在 JSE 7 上可用(例如 TrueZIP 路径模块),因此需要执行运行时测试。

使用正确的类加载器实现,您将永远不会看到 NoClassDefFoundError。然而,一些环境已经破坏了类加载器的实现,它们执行急切的类加载——尽管规范要求延迟类加载。只有这样你才会得到 NoClassDefFoundError。

另一方面,请注意项目的 Eclipse 许可证。如果你真的想通过修补来解决这个问题(你不能因为 java.io.File 和 java.nio.file.Path 之间存在循环依赖关系,这是这种设计的原因),那么你将不得不发布这个 fork .

附录:

Java 6 的 Java 语言规范第 12.2.1 章“加载过程”中写道:

ClassLoader 的不同子类可以实现不同的加载策略。特别是,类加载器可以缓存类和接口的二进制表示,根据预期使用预取它们,或者一起加载一组相关的类。例如,如果由于类加载器缓存了旧版本而找不到新编译的类版本,则这些活动可能对正在运行的应用程序不是完全透明的。然而,类加载器的职责是仅在程序中没有预取或组加载的情况下可能出现加载错误的地方反映加载错误。

英语不是我的母语,但我从最后一句话中得出的结论是,只要类加载器不会因为未使用的类未能及时加载而引发类加载器,就可以进行急切的类加载。因此,如果由于 TFile.toPath() 需要返回 java.nio.file.Path 导致类加载器抛出,尽管您从未调用此方法,那么我认为这是类加载器的问题。顺便说一句,TFile.toPath() 会引发 UnsupportedOperationException - 请查看 Javadoc 了解详细信息。

我宁愿采取另一条路线,但 java.io.File.toPath() 和 java.nio.file.Path.toFile() 之间的循环依赖让我别无选择。

于 2013-01-12T01:01:54.370 回答