TFile依赖于java.nio.file.Path (toPath()方法返回java.nio.file.Path),这在Java6上是不可用的,因此在Java6上调用任何TFile方法都会抛出"java.lang.NoClassDefFoundError: java/nio/file/Path“
如何在Java6上使用TFile?我正在考虑的是获取源代码,不使用这种方法重新编译它们,并使用一个修补的版本,这是一种令人不快的解决方案。
发布于 2013-01-12 09:01:54
不,TrueZIP 7不需要JSE7,JSE6作为主页文档就足够了。然而,一些特性仅在JSE7上可用(例如,TrueZIP路径模块),因此需要执行运行时测试。
使用正确的类加载器实现,您将永远不会看到NoClassDefFoundError。然而,一些环境破坏了类加载器的实现,尽管规范要求进行懒惰的类加载。只有到那时,你才会得到一个NoClassDefFoundError。
另外,请注意项目的Eclipse许可证。如果你真的想通过打补丁来解决这个问题(你不能这样做,因为java.io.File和java.nio.file.Path之间存在循环依赖,这就是这个设计的原因),那么你就必须发布这个分支。
附录:
Java6的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()之间的循环依赖让我别无选择。
https://stackoverflow.com/questions/14270141
复制相似问题