TrueZip 7需要Java 7吗? NoClassDefFoundError:Java 6上的java / nio / file / Path

时间:2013-01-11 01:15:44

标签: truezip

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

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

1 个答案:

答案 0 :(得分:2)

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

使用正确的类加载器实现,您将永远不会看到NoClassDefFoundError。但是,有些环境破坏了类加载器实现,这些实现会进行急切的类加载 - 尽管规范规定了延迟类加载。只有这样你才会得到NoClassDefFoundError。

另外请注意,请注意项目的Eclipse许可证。如果你真的想通过修补来修复它(你不能因为java.io.File和java.nio.file.Path之间存在循环依赖关系,这就是这个设计的原因),那么你必须发布这个fork

<强>附录

Java 6 Java语言规范chapter 12.2.1 "The Loading Process"读取:

  

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

英语不是我的母语,但是我从最后一句话中得到它,即只要因为一个未使用的类没有急切加载而导致类加载器没有引发就可以了。因此,如果一个类加载器因为TFile.toPath()需要返回一个java.nio.file.Path而抛出,尽管你从不调用这个方法,那么我认为这是类加载器的一个问题。另外,TFile.toPath()会抛出UnsupportedOperationException - 请查看Javadoc以获取详细信息。

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