【问题标题】:How does Java efficiently search jar files for classes?Java 如何有效地在 jar 文件中搜索类?
【发布时间】:2010-01-07 14:01:41
【问题描述】:

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

【问题讨论】:

    标签: java algorithm search jar performance


    【解决方案1】:

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

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

    【讨论】:

    • 在 Java 7 中,他们试图通过支持类似于 OSGi 的模块系统来弥补这一点
    • @Hassan。索引是可选的,默认确实是线性的:新的类加载方案完全向后兼容在当前扩展机制之上开发的应用程序。当类加载器加载第一个 jar 文件并在 META-INF 目录中找到一个 INDEX.LIST 文件时,它将构建索引哈希表并为扩展使用新的加载方案。否则,类加载器将简单地使用原始的线性搜索算法。
    • @Hassan 此信息没有过时,这是默认行为,我几乎从未见过 JAR 索引。也许重新考虑您的投票和您对此的理解。
    • @Pascal,你的答案读起来像是一个整体——你排除了索引可能存在的事实。您应该发布整个图片 - 因为 OP 担心效率。
    • @Hassan 对不起,但我正在描述 default 行为,这似乎是 OP 所要求的。你所描述的是例外。
    【解决方案2】:

    默认是线性的;但是,由于JDK 1.3,JAR 索引可以嵌入到应用程序的第一个 JAR 文件中。

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

    链接到 JAR 索引上的 SUN Resource。注意:似乎没有涵盖非类资源。

    【讨论】:

    • 你认为索引的使用很普遍吗?我认为仍然是线性行为是默认的,你需要添加一个索引,很多人不这样做。
    • 无论如何,所有 zip 文件的末尾都有一个索引,所以没有太大区别。
    • hmm,似乎 ANT 默认 ant.apache.org/manual/CoreTasks/jar.html 为 false 以在 JAR 文件中生成索引。我想知道IDE是做什么的?
    • @Hassan,@djna,在我的 Maven 仓库中的 342 个罐子中,只有 2 个有 INDEX.LIST!不幸的是,生成这些并不常见。
    • 生成索引是特定于应用程序的,因为您无法预测哪个 JAR 将位于类路径中。使用索引绝对不常见,也绝对不是常态。根据您自己提供的链接,这个想法最初是为了帮助小程序,但现在谁在使用它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2012-05-07
    • 2019-10-30
    • 2011-04-25
    相关资源
    最近更新 更多