INDEX.LIST
INDEX.LIST
一、INDEX.LIST 是什么?
jar 包里面声明的索引列表,描述了 jar 包下所有的资源文件的路径,包含了应用程序及其扩展程序中的包的位置信息。
其作用就类似一个索引目录,目的是为了快速定位,类加载器会使用它来提高类的加载速度。
二、为什么要用 INDEX.LIST?
明确一点,应用程序在没加载某个类前,是不知道这个类是在哪个 jar 包里面的。
这个时候,想要找到这个类,应用程序就必须遍历所有的 jar 包,然后在每个 jar 包里面去查找这个类。
如果 jar 包是在网络中,那么这个过程是非常耗时和浪费带宽的。
- 为了优化类的搜索过程,jar 包规范中就提出了一个 JarIndex 索引机制
- JarIndex 机制会收集应用程序中定义的所有 JAR 文件的内容,并将这些信息存储到第一个 JAR 文件中的索引文件中
这个索引文件就是 INDEX.LIST。
比如说,INDEX.LIST 文件示例如下:
1 | JarIndex-Version: 1.0 |
这个索引文件内容的含义就是:
- 这个jar包索引了其他3个jar文件,分别是:
JarIndex_Main.jar
、JarIndex_test.jar
、SampleDir/JarIndex_test1.jar
JarIndex_Main.jar
中包含了sp
这个包JarIndex_test.jar
中包含了Sample
这个包SampleDir/JarIndex_test1.jar
中包含了org
、org/apache
、org/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.jar
和 SampleDir/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
的索引文件。