INDEX.LIST

INDEX.LIST

一、INDEX.LIST 是什么?

jar 包里面声明的索引列表,描述了 jar 包下所有的资源文件的路径,包含了应用程序及其扩展程序中的包的位置信息。

其作用就类似一个索引目录,目的是为了快速定位,类加载器会使用它来提高类的加载速度。

二、为什么要用 INDEX.LIST?

明确一点,应用程序在没加载某个类前,是不知道这个类是在哪个 jar 包里面的。

这个时候,想要找到这个类,应用程序就必须遍历所有的 jar 包,然后在每个 jar 包里面去查找这个类。

如果 jar 包是在网络中,那么这个过程是非常耗时和浪费带宽的。

  • 为了优化类的搜索过程,jar 包规范中就提出了一个 JarIndex 索引机制
  • JarIndex 机制会收集应用程序中定义的所有 JAR 文件的内容,并将这些信息存储到第一个 JAR 文件中的索引文件中

这个索引文件就是 INDEX.LIST。

比如说,INDEX.LIST 文件示例如下:

1
2
3
4
5
6
7
8
9
10
11
JarIndex-Version: 1.0 
JarIndex_Main.jar
sp
JarIndex_test.jar
Sample
SampleDir/JarIndex_test1.jar
org
org/apache
org/apache/xerces
org/apache/xerces/framework
org/apache/xerces/framework/xml4j

这个索引文件内容的含义就是:

  1. 这个jar包索引了其他3个jar文件,分别是:JarIndex_Main.jar JarIndex_test.jarSampleDir/JarIndex_test1.jar
  2. JarIndex_Main.jar 中包含了 sp 这个包
  3. JarIndex_test.jar 中包含了 Sample 这个包
  4. SampleDir/JarIndex_test1.jar 中包含了 orgorg/apacheorg/apache/xerces 这些包

也就意味着,如果应用程序要加载 org.apache.xerces.framework.xml4j.XML4JConfiguration 这个类时,可以优先去 SampleDir/JarIndex_test1.jar 这个 jar 包里面查找。

如果在 SampleDir/JarIndex_test1.jar 里面就找到了类,那就不需要去遍历所有的 jar 包搜索了。

通过这种索引机制,可以减少遍历所有的 jar 包的情况,提高类的加载速度。

三、索引 jar 包的层级结构

在 jar 包中,如果有一个名为 META-INF/INDEX.LIST 的文件,那么这个 jar 包就是一个索引 jar 包。

这个索引 jar 包中的 INDEX.LIST 文件就是索引文件,它的内容就是上面的示例内容。

如果一个 jar 包是索引 jar 包,那么它就会包含其他的 jar 包,这些 jar 包就是它的扩展 jar 包。

扩展 jar 包的内容就是索引 jar 包中 INDEX.LIST 文件中的内容。

比如说,JarIndex_Main.jar 就是一个索引 jar 包,它的扩展 jar 包就是 JarIndex_test.jarSampleDir/JarIndex_test1.jar

这样就形成了一个索引 jar 包的层级结构。

四、如何创建 INDEX.LIST 索引

使用下述命令为 JarIndex_Main.jar、JarIndex_test.jar 和 JarIndex_test1.jar 创建一个索引文件

1
jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar

这样就会在 JarIndex_Main.jar 中创建一个名为 META-INF/INDEX.LIST 的索引文件。

参考

https://www.cnblogs.com/anuoruibo/p/2432160.html

作者

jiaduo

发布于

2023-01-09

更新于

2023-04-02

许可协议