2013-01-11 52 views
3

TFile取決於Java 6上不可用的java.nio.file.Path(toPath()方法返回java.nio.file.Path),因此調用任何TFile Java 6上的方法拋出「java.lang.NoClassDefFoundError:java/nio/file/Path」TrueZip 7需要Java 7嗎? NoClassDefFoundError:Java 6上的java/nio/file/Path

如何設法在Java 6上使用TFile?我在想的是獲取源代碼,不使用這種方法重新編譯它們,並使用補丁版本,這是一種令人不快的解決方案。

回答

2

不,TrueZIP 7不需要JSE 7,JSE 6就足夠作爲主頁文件。但是,某些功能僅在JSE 7上可用(例如TrueZIP路徑模塊),因此會執行運行時測試。

使用正確的類加載器實現將永遠不會看到NoClassDefFoundError。但是,有些環境破壞了類加載器實現,它們會進行急切的類加載 - 儘管該規範強制實施了惰性類加載。只有這樣你纔會得到一個NoClassDefFoundError。

另一方面,請注意項目的Eclipse許可證。如果你真的想通過修補來解決這個問題(你不能這樣做,因爲java.io.File和java.nio.file.Path之間存在循環依賴關係,這是設計的原因),那麼你將不得不發佈這個fork 。

附錄:

Java語言規範的Java 6,chapter 12.2.1 "The Loading Process"寫着:

Different subclasses of ClassLoader may implement different loading policies. In particular, a class loader may cache binary representations of classes and interfaces, prefetch them based on expected usage, or load a group of related classes together. These activities may not be completely transparent to a running application if, for example, a newly compiled version of a class is not found because an older version is cached by a class loader. It is the responsibility of a class loader, however, to reflect loading errors only at points in the program where they could have arisen without prefetching or group loading.

英語不是我的母語,但我把它從最後一句是渴望類加載只要類加載器不會因爲一個未使用的類急切加載而拋出。所以如果一個類加載器拋出了,因爲TFile.toPath()需要返回一個java.nio.file.Path,儘管你永遠不會調用這個方法,那麼我認爲這是類加載器的一個問題。另外,TFile.toPath()會拋出一個UnsupportedOperationException - 請檢查Javadoc以獲取詳細信息。

我寧願採取另一條路線,但java.io.File.toPath()和java.nio.file.Path.toFile()之間的循環依賴關係讓我別無選擇。

+0

在規範中懶惰類加載*授權*?你可以包括突出的摘錄嗎? –

+0

謝謝!現在我決定回到TrueZip 6.8.4。 –

+0

另外,當您說「使用正確的類加載器實現」時,它並不是我可以選擇或切換的東西 - 當我使用Intellij IDEA和TeamCity通過Spock在Java 6上運行時,我的測試失敗。 –