gpt4 book ai didi

java - 有关 InvalidJarIndexException 的问题?

转载 作者:行者123 更新时间:2023-11-29 09:24:49 24 4
gpt4 key购买 nike

我浏览了 JAR规范文档,发现内存中的 hashtable 是使用 INDEX.LST 文件创建的,以加快类文件查找过程。

如果有人能回答我下面的问题-

  1. 什么时候构建hashtable?应用程序何时加载或加载小程序的请求何时到来?

  2. 既然所有类都已经是存档的一部分,为什么还要得到 InvalidJarIndexException。索引如何变得无效?例如在我的例子中,当我在我的 ant 构建中使用 index=trueindexjars 时,我得到了 InvalidJarIndexException 但当 indexjars 是未使用。

  3. 如果我想坚持使用索引,我应该如何解决 InvalidJarIndexException

  4. java浏览器插件在下载jar文件中的作用?

最佳答案

JarIndex 似乎对小程序和网络很有用。它可以防止加载不必要的文件。

这里我们有一个所谓的 root jar,它包含一个 INDEX.LIST 文件,该文件包含从类到库的映射。类加载器将读取该文件,创建一个内部哈希表并使用该表来确定可以在何处找到类。如果库还没有加载,那么它会加载它来加载类。否则它必须一次加载所有库来解析单个类(因为类名永远不会提供任何可以找到类的线索)

一旦类加载器找到这样的索引,它就会信任该信息,如果该信息不正确,它会报错并抛出异常。假设索引告诉类加载器 com.example.MyClass 可以在 http://example.com/a.jar 中找到,然后它将下载(如果还没有完成)jar 并只查看这个库的内部。如果没有这样的类,它不会查看不同的 jar(甚至下载额外的 jar),但会遇到麻烦(并抛出异常)。

如果遇到这样的异常,您可能会迷失方向。问题(损坏的 INDEX.LIST 文件)无法在消费者端修复。但是由于类加载器需要类路径中第一个 jar 中的 INDEX.LIST 文件,因此更改类路径表达式中库的顺序可以通过禁用索引器功能来解决此类问题。


延伸阅读


使用 ant 的工作示例

我创建了两个非常简单的类来打印 Hello world:

package test;

public class Hello {
public static void main(String[] args) {
System.out.println(HelloTextFactory.createResponse());
}
}

package test;

public class HelloTextFactory {
public static String createResponse() {
return "Hello world";
}
}

和一个 ant 文件 (build.xml) 来创建文件:

<project name="test">
<target name="jar" description="description">
<delete file="main.jar" />
<delete file="factory.jar" />

<jar destfile="factory.jar" includes="test/HelloTextFactory.class" basedir="bin" />
<jar destfile="main.jar" includes="test/Hello.class" basedir="bin" index="true">
<indexjars>
<fileset dir="." id="jars">
<include name="factory.jar" />
</fileset>
</indexjars>
<manifest>
<attribute name="Main-Class" value="test.Hello" />
<attribute name="Class-Path" value="factory.jar" />
</manifest>
</jar>
</target>
</project>

此构建文件假定类已在运行脚本之前编译到 bin 文件夹中。

运行构建脚本会创建两个 jar,main.jar 包含一个索引并且 java -jar main.jar 成功运行。然后我将第二个类移到另一个包中并再次开始构建。再次,它创建了一个工作应用程序。

在实验过程中我意识到

  • 有必要强制创建所有 jar,尤其是主 jar。如果 ant 重建 factory.jar 索引将不会更新并且可能无效。这就是我添加 delete 任务的原因。
  • main.jar 必须在创建所有其他 jar 之后创建。

关于java - 有关 InvalidJarIndexException 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3417239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com