Java如何高效地在jar文件中搜索类?

Java如何高效地在jar文件中搜索类?,java,algorithm,search,jar,performance,Java,Algorithm,Search,Jar,Performance,假设我有500个jar文件链接到我的程序,总容量超过500 MB(所有jar的大小,不是每个jar的大小),我的程序调用其中一个jar中的类。Java如何通过JAR搜索一个类,其效率如何?O(n)?O(log(n))?默认情况下,它过去是线性的;但是,由于JAR索引可以嵌入到应用程序的第一个JAR文件中。 这意味着,如果索引嵌入到JAR文件中,则类装入器可以有效地查找分布在属于应用程序的多个JAR文件上的所有类 链接到JAR索引上。注意:非类资源似乎不包括在内。Java在jar的内部目录结构中查

假设我有500个jar文件链接到我的程序,总容量超过500 MB(所有jar的大小,不是每个jar的大小),我的程序调用其中一个jar中的类。Java如何通过JAR搜索一个类,其效率如何?O(n)?O(log(n))?

默认情况下,它过去是线性的;但是,由于JAR索引可以嵌入到应用程序的第一个JAR文件中。

这意味着,如果索引嵌入到JAR文件中,则类装入器可以有效地查找分布在属于应用程序的多个JAR文件上的所有类


链接到JAR索引上。注意:非类资源似乎不包括在内。

Java在jar的内部目录结构中查找完全限定名的精确匹配。看起来,;它不搜索。如果类路径上有500个jar文件,Java将按照指定的顺序逐个查找,直到找到匹配的jar文件。如果包含给定类的jar是最后一个,Java将查找500个jar文件。所以我猜是O(n)


更新:上述行为是默认行为。然而,正如Hassan所指出的,这可以通过在根jar文件中提供一个允许类加载器通过简单地查找包名来找到合适的jar文件来进行优化。

在Java 7中,他们试图通过支持模块系统来弥补这一点,类似于OSGi@Hassan. 索引是可选的,默认值实际上是线性的:新的类加载方案与在当前扩展机制之上开发的应用程序完全向后兼容。当类加载器加载第一个jar文件并且在META-INF目录中找到INDEX.LIST文件时,它将构造索引哈希表,并对扩展使用新的加载方案。否则,类加载器将只使用原始的线性搜索算法。@Hassan此信息没有过时,这是默认行为,我几乎从未见过JAR索引。也许重新考虑一下你的投票和你对此的理解。@Pascal,你的答案读起来像一个整体——你排除了索引可能存在的事实。您应该发布整个图片——因为OP担心效率。@Hassan抱歉,但我正在描述OP要求的默认行为。你所描述的是一个例外。你认为索引的使用很普遍吗?我认为默认情况下仍然是线性行为,您需要添加索引,而许多人不这样做。所有ZIP文件的末尾都有一个索引,因此没有多大区别。嗯,对于JAR文件中的索引生成,ANT似乎默认为false。我想知道IDE做了什么?@Hassan,@djna,在我的maven repo的342个罐子中,只有2个有INDEX.LIST!不幸的是,生成索引并不常见。生成索引是特定于应用程序的,因为您无法预测类路径上会出现哪个JAR。使用索引绝对不常见,也绝对不规范。根据你自己提供的链接,最初的想法是帮助applet,但现在谁在使用它们呢?