2010-01-07 61 views
12

假設我有500個jar文件鏈接到我的程序總計超過500 MB(所有jar的大小,不是每個),我的程序打電話給位於其中一個類的類。 Java如何通過罐子搜索一個類,以及這樣做的效率如何?上)? O(日誌(n))的?Java如何有效地搜索類文件的jar文件?

回答

10

Java在jar的內部目錄結構中查找完全限定名稱的完全匹配。它看起來;它不搜索。如果在類路徑中有500個jar文件,Java將按照指定的順序逐個查找它們,直到它找到匹配。如果包含給定類的jar是最後一個,Java將查找500個jar文件。所以我想這是O(n)。

更新:上述行爲是默認行爲。但是,正如Hassan指出的那樣,可以通過在根jar文件中提供JarIndex來優化此功能,從而允許類加載程序通過簡單查找包名找到適當的jar文件。

+0

在Java 7中,他們試圖通過支持類似於OSGi – notnoop 2010-01-07 14:17:35

+0

(-1)的信息已過時的模塊系統進行贖回。 – 2010-01-07 14:23:10

+1

@Hassan。索引是可選的,默認是線性的:新的類加載方案完全向後兼容當前擴展機制之上開發的應用程序。當類加載器加載第一個jar文件並在META-INF目錄中找到INDEX.LIST文件時,它將構造索引散列表併爲擴展使用新的加載方案。否則,類加載器將簡單地使用原始的線性搜索算法。 – djna 2010-01-07 14:23:19

7

默認情況下,它曾經是線性的;但是,由於JDK 1.3 JAR索引可以嵌入到應用程序的第一個JAR文件中。

這意味着如果索引嵌入到JAR文件中,類加載器可以高效地找到分佈在屬於應用程序的多個JAR文件上的所有類。

鏈接到SUN Resource JAR索引。注意:非類資源似乎沒有被覆蓋。

+0

您是否認爲索引的使用很普遍?我認爲線性行爲仍然是默認行爲,您需要添加一個索引,而許多人不會。 – djna 2010-01-07 14:26:13

+0

無論如何,所有的zip文件都有一個索引,所以它沒有太大的區別。 – 2010-01-07 14:28:04

+0

hmm,看來ANT默認http://ant.apache.org/manual/CoreTasks/jar.html爲JAR文件中的索引生成。我不知道IDE是做什麼的? – 2010-01-07 14:29:41