专利名称:一种类文件装载方法和系统的制作方法
技术领域:
本发明涉及类装载领域,特别是涉及一种类文件的装载方法和系统。
技术背景基于java的大型企业软件,如基于java的ERP (企业资源计划,Enterprise Resource Planning)软件可能存在成百上千个jar文件,并且需要装载的组件可 能来自第三方系统,在启动与运行这样的软件系统时,为了提高启动与运行时 系统的效率、获得良好的性能,需要JVM (Java Virtual Machine, java虚拟机) 快速查找定位与装载相关的类(class)文件和资源文件。中,但是类装载器(classloader )也不是原封不动的装载到JVM,它是将类(class ) 文件中的内容转换成JVM使用的类字节码,通过类装载器装载到JVM中的字 节码数据,从而成为可执行的代码。类装载是Java语言提供的最强大的机制之一, 一个类代表要执行的代 码,而数据则表示其相关状态。状态时常改变,而代码则不会。当我们将一个 特定的状态与一个类相对应起来,也就意味着将一个类事例化。尽管相同的类 对应的实例其状态千差万别,但其本质都对应着同一段代码。 一旦一个类被载 入Java虚拟机中,同一个类就不会被再次载入了 。 java的类装载机制是在同 一个JVM中,按类路径的层次和顺序装载类文件。假定有 一 个大型的Java应用,它需要从c:\app\pathl ; d:\path2; d:\app\path3三个目录下装载java运行的组件,其中pathl下有Al.jar, A2.jar,A3 .jar...... An.jar; path2目录下有Bl.jar, B2.jar, B3.jar......Bn.jar; path3目录下存在Cl.jar, C2.jar,C3.jar......Cn.jar, 其启动类为com.app.MainClass,存放在C3.jar的com/app目录下。现有技术中Java标准的启动方式为java —cpc :\app\path 1 \A 1 .j ar;.....;C :\app\path 1 VAn.jar;d:\path2VB 1 .j ar;.....d:\path2VBn.j ar;d:\app\path3\Cl.jar;......;d:\app\path3\Cn.jar com.app.MainClass。 其中java为java程序启动命令,-cp后面是java应用所需要的所有java组件列表,即Java类 路径,com.app.MainClass就是java应用启动类。
执行所述命令时,首先启动Java虚拟机,完成相关初始化工作后,虚拟机 开始装载应用需要的第一个类文件com.app.MainClass,由于标准的Java虚拟 才几并不知道这个类文件在哪个jar文件中,所以虚拟机必须根据-cp后面的类^各 径逐个打开jar文件,顺序查找该jar文件中是否包含com.app.MainClass。由于jar文件比较多,而且每个jar文件包含了大量的class文件。按上面 的方式装载class文件,会存在系统在启动与运行时造成效率低下、性能差的 问题;进一步,由于所有操作系统启动程序的命令行都有大小限制,如window 默认为8000个字符,并且需要装载的文件多,从而导致类路径过长,超出操 作系统限制;而且java虚拟机为了提高系统启动时的效率,避免反复打开/关 闭文件,会緩存每个jar文件句柄,这样就可能导致程序运行时打开的文件句 柄过多,而操作系统对每个程序进程打开的文件句柄数一般是有限制的,因此 大量的文件句柄会也会导致系统存在效率低下、性能差的问题,并且还会导致 运行时出现异常。发明内容本发明所要解决的技术问题是提供一种类文件的装载方法,能够在装载类 文件时不按照java默认顺序查找、装载类文件,解决java默认顺序查找导致 的性能问题,提高系统启动、运行时类文件的装载效率。为了解决上述问题,本发明公开了一种类文件装载方法,包括步骤 自定义一个类装载器替换java虚拟机默认的系统类装载器; 才艮据自定义的类装载器规则,生成Java应用所需jar文件的索引文件; Java虚拟机启动所述自定义的类装载器,初始化自定义类装载器; 自定义类装载器装载类文件。其中,所述自定义类装载器装载类文件的具体步骤为自定义类装载器请求上一级的应用类装载器装载类文件,如果所述应用类 装载器装载不成功,贝'J:自定义类的类装载器^^艮据所述索引文件装载类文件。进一步,所述自定义的类装载器根据生成的索引文件查找对应的jar文件, 从所述jar文件中确定要装载的类文件,装载所述确定的类文件。进一步,根据类文件被自定义的类装载器装载的命中率緩存确定数量的jar文件句柄。其中,所述自定义类装载器装载类文件的具体步骤包括 Java虚拟机通知自定义的类装载器要装载的类;自定义的类装载器请求上一级的应用类装载器装栽所述类,如果装载不成 功,则自定义的类装载器解析该类对应的包名 根据所述包名,从生成的索引文件中确定对应的jar文件; 判断所述jar文件中是否包含对应的类文件,有则装载,否则 判断下一个jar文件中是否包含对应的类文件,重复上一步,完成类文件 的装载。其中,所述生成Java应用所需jar文件的索引文件的具体步骤包括 扫描每个路径下的所有jar文件,根据每个jar文件中的每个目录生成该目 录到jar文件名的映射,在当前路径下生成索引文件。其中,所述在当前路径下生成索引文件的具体步骤包括打开第一/下一个路径;逐个打开所述路径下的所有jar文件;递归查找所述打开的jar文件中的每个目录,如果该目录下包括类文件, 则生成该目录与jar文件的映射;根据所述生成的映射生成索引文件。进一步,当Java应用所需的jar文件变化时,则再次生成Java应用所需jar 文件的索引文件。本发明还公开了一种类文件装栽系统,包括替换单元,用于自定义一个类装载器替换Java虚拟机默i^的系统类装载器;索引文件生成单元,才艮据自定义的类装载器规则,生成Java应用所需jar 文件的索引文件;初始化单元,用于当Java虚拟机启动所述自定义的类装载器时,初始化 自定义类装载器;第一装载单元,用于自定义类装载器装载类文件。
其中,所述第一装载单元包括请求单元,用于请求上一级应用类装载器装载类文件;判断单元,用于判断上一级应用类装载器装载类文件是否成功;第二装载单元,用于所述自定义类的类装载器根据索引文件装载类文件。与现有技术相比,本发明具有以下优点本发明通过自定义类装载器替换虚拟机默认的系统类装载器,使用自定义 的类装载器装载类文件。自定义类装载器根据本发明所述方法确定装载相关类 文件首先代理到应用类装载器装载jvm自身标准组件;如果应用类装载器无 法装载所述类文件,则根据类文件的名称空间映射关系确定相关的包文件,从中 装载java类文件。进一步,为了加快文件查找速度,可以根据jar文件命中率 緩存一定数量的jar文件句柄,从而避免文件频繁打开与关闭操作影响系统性 能,并且避免打开文件超出操作系统的限制,提高了系统启动时的类装载效率。 当虚拟机启动时,首先初始化自定义的类装载器,自定义的类装载器会根据当前 路径下的索引文件建立java名称空间(目录,java package)与Jar文件的对应映 射关系,通过支持变量的绝对路径方式,可以解决第三方系统集成的问题。
图l是本发明java类装载器层次结构图;图2是本发明实施例类文件装载方法的流程图;图3是图2所示本发明实施例中步骤202生成索引文件的具体步骤流程文件的方法流程图;图5是本发明实施例类文件装载系统的结构框图; 图6是图5中第一装载单元的组成结构图。
具体实施方式
Java虚拟机(Java VirtualMachine,JVM):可运行java代码的虚拟计算机, 只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的
任何java代码能够在该系统上运行。JVM拥有自己完善的硬件架构,如处理器、 堆栈、寄存器等,并且还具有相应的指令系统。类文件(class):用于存储java程序运行时代码指令集的文件,每个类文件 只属于某一个包(Package)。包(Package):类文件的名称空间,在物理存储上与文件系统的目录对应。类装载器java类装载器,由于java程序包含很多的类文件,并且这些文 件不像静态的C程序一次性装载入内存,它们只有在需要的时候才装载。Java 类装载器从类文件获取不依赖平台的字节码,然后将它们装载到JVM内存空间 运行。Jar文件包含多个java类文件和相关资源的同 一存储库。是java程序组件 分发的一种通用形式。本发明的原理在Java启动命令中设置自定义的类装载器替换虚拟机默认 的系统类装载器,虚拟积4吏用自定义的类装载器才艮据索引文件来装载类文件。自定义类装载器根据以下方法查找定位相关Java类文件首先代理到应 用类装载器(AppClassLoader)装载jvm自身的标准组件;如果应用类装载器 (AppClassLoader)无法装载该类文件,则根据类文件的名称空间映射关系查找 打开相关的Jar文件,从中装载类文件。为了加快文件查找速度,还可以才艮据Jar 文件命中率緩存一定数量的Jar文件句柄,避免文件频繁打开与关闭操作影响的系统启动的效率,提高启动系统的速度。当虚拟机启动时,首先就会初始化 自定义的类装载器,此时,自定义的类装载器会根据当前路径下的INDEX丄IST 文件建立java名称空间(目录)与Jar文件的对应映射关系。通过支持变量的 绝对路径方式,可以解决第三方系统集成装载的问题。为了更清楚的理解本发明,首先对本发明所述的Java类装载器的层次规 则进行介绍根据java规范,JVM的类装载器默认存在三个层次,如图1, 示出了 java类装载器的层次结构图。第一级就是启动类装载器(BootStrapClassLoader ),用于虚拟机装载自身 的标准类文件,即装载默认rt.jar中的标准虚拟机内核类文件。第二级是扩展类装载器(ExtendClassLoader),用于装载虚拟机目录lib/ext
目录下的所有jar文件。第三级是应用类装载器(AppClassLoader),用于装载类路径中定义的所有 jar文件,所述应用类装载器是Java应用所使用的类装载器。第四级是一个隐含的系统类装载器(SystemClassLoader),默认没有设置, 所述系统类装载器位于应用类装载器的下一级。其中所述启动类装载器、扩展类装载器、应用类装载器在虚拟机初始化时 已经创建好,用于装载虚拟机自身组件。Java规范推荐类装载器采用上一级优 先的代理规则,即当查找类文件时,先从上一级类装载器查找,上一级类装载 器无法装载对应的类文件时才在本级类装载器的类路径中装载。当虚拟通过自 定义的类装载器装载组件时,如果自定义的类装载器找不到相关组件,则直接 调用上级类装载器来装载组件。为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本发明作进一步详细的说明。参照图2,示出了本发明实施例类文件的装载方法的流程图,包括以下步骤步骤201、自定义一个类装载器替换Java虚拟机默:〖人的系统类装载器。 通过在Java启动命令中设置自定义的类装载器,用所述自定义的类装载 器替换虚拟机默认的系统类装载器。java虚拟机支持自定义方式扩展虚拟机查 找类文件的行为,所述自定义的类装载器继承自虚拟机的类装载器。自定义的 类装载器遵循java标准,但是重载了标准类装载器查找、装载类文件的方法。 自定义类装载器查找、装载类文件的具体方法将在后面进行详细的描述,在此 不进行介绍。步骤202、生成java应用所需jar文件的索引文件。根据自定义的类装载器规则,生成Java应用所需jar文件的索引文件。下面以一个实例说明生成索引文件的详细过程,通过java —cp smartclassloar.jarA. SmartClassLoaderlndexFilePATHl=c:\app\pathl PATH2=d:\path2 PATH3=d:\app\path3即可在当前-各径 下生成index.lst文件。生成索引文件的算法包装在A. SmartClassLoaderlndexFile
这个类中,SmartClassLoaderlndexFile这个组件会扫描每个路径下的所有jar 文件,根据每个jar文件中的每个目录生成该目录到jar文件名的映射。进一步,如果Java应用所需要的jar文件变化时,则重新生成java应用所 需jar文件的索引文件。步骤203、 Java虚拟机启动所述自定义的类装载器,初始化自定义类装载器。程序时使用所述自定义的类装载器。下面以一个实例详细说明其过程在执行 java 的程序参数中添力口 -Djava.system.class.loader= A.SmartClassLoader通知虚拟才几运4亍该Java程序时4吏用自定义的系统类装载 器,其中SmartClassLoader即为所述自定义的类装载器;其中,所述 -DSmartClassloader.indexFile=./index.lst参数通知所述自定义类装载器该应用 的jar文件索引文件为当前路径下的index.lst。 完整参数如下java—cp smartclassloader.jar—Djava.system.class.loader=A..SmartClassLoader—DsmartpiassLoader.indexFile=./index.lst—DPATHl=c:\app\pathl —DPATH2=d:\path3 —DPATH3=d:\app\path3 app.MainClass上面参数行表示启动一个java虚拟机,java虚拟机在完成相关初始化工 作后,必须创建一个SystemClassLoader用于装载应用相关的组件,由于自定 义的类装载器SmartClassLoader也是标准的java类文件,虚拟机通过-cp smartclassloader.j ar通知虚拟机可以从smartclassloader.j ar 中装载。初始化 SmartClassLoader之后,java虚拟机开始装载应用相关组件,由于指定 java.system.class.loader 为 SmartClassLoader, 戶斤 ^乂 虚 #以才几会通过 SmartClassLoader来装载运行时所有必须的java组件。步骤204、所述自定义的类装载器装载类文件。自定义的类装载器首先请求上一级的应用类装载器装载Java虚拟机自身 的标准组件,如果没有找到相关文件,则表示该类文件属于应用程序自己的jar
类装载器根据生成的索引文件查找对应的jar文件,从所述jar文件中确定要装 载的类文件,装载所述确定的类文件。进一步,为了加快文件的查找速度,提高系统启动时装载类文件的效率, 根据jar文件命中率緩存确定数量的jar文件句柄,避免文件的频繁打开与关闭 操作影响系统启动的效率。其中,所述确定数量的jar文件句柄根据配置緩存 的大小确定,本发明并不进行精确的限定。由于本发明不再采用顺序查找、装 载类文件的方法,因此,打开的jar文件不会太多,即使緩存所有打开jar文件 句柄,也不会超出操作系统的限制,不会引起系统发生异常。本发明采用自定义的类装载器重载类文件的查找、装载方法,采用索引文 件查找类文件的方法替换现有技术中的根据类路径顺序查找类文件的方法,装 载类文件时不需要打开很多的jar文件,不会导致启动时超出操作系统命令上 限。提高了启动时的效率,并且本发明所生成的索引文件不存在相对路径的限 制,可以与第三方系统集成。参照图3,示出了图2所示本发明实施例中步骤202生成索引文件的具体 步骤流程图,包括步骤步骤2021、打开第一个路径,进入步骤2022。步骤2022、逐个打开所述鴻4圣下的所有jar文件,针对每个jar文件,进 入步骤2023。步骤2023、递归查找打开的jar文件中的每个目录,如果所述目录下包含 类文件,则生成所述目录与jar文件的映射。 下面以实例对此进行详细说明布支设C3.jar中包含com.app.MainClass这个类文件,根据java规范,这个 类文件必须保存在C3.jar中的com/app目录下,所述生成的映射为 com/app^C3.jar,如果该jar包中存在多个目录,可以生成多个这样的映射, 如com/app/client~>C3.jar、 com/erp》Al.jar。在索引文件(index.lst)中的体 现形式就是com/app=$ {PATH3 }/C3 .j arcom/app/client=$ {PATH3 }/C3 .jarcom/erp=${PATHl }/Al .jar
步骤2024、判断是否存在下一个路径,有则重复步骤2022、 2023;无则 进入步骤2025。步骤2025、根据所述生成的映射生成索引文件。 以下为一个最终生成的索引文件的实例 com/eas/app=${PATHl }/Al .jar;${PATH2}/B5.jar com/app=$ {PATH3} /C3 .j ar com/erp=$ {PATH 1} /A 1 j arcom/app/client=$ {PATH3 }/C3 .jar;$ {PATH1 }/A3 .jar参照图4,示出了图2所示本发明实施例中步骤204中所述自定义的类装 载器装载类文件的方法流程图,包括步骤步骤2041、 Java虚拟机通知自定义的类装载器要装载的类。因为Java程序是动态运行的,只有当调用到类文件时才装载类文件中的 字节码。Java虚拟机支持自定义方式扩展虚拟机查找类文件。当程序运行时需 要调用某个类的功能时,虚拟机通知类装载器装载该类,此时虚拟机告诉类装 载器需要装载的类的名称。步骤2042、自定义的类装载器请求上一级的应用类装载器装载所述类。自定义的类装载器首先请求上一级的应用类装载器装载类类文件,此时虚 拟机自身的标准组件类文件被所述应用类装载器装载,如果没有找到相关文 件,则表示所述类属于应用程序自身的jar文件,装载不成功,进入步骤2043。步骤2043、自定义的类装载器解析该类对应的包名。包是指类文件的名称空间,在物理存储上与文件系统的目录对应,此处的 包名也即索引文件中的目录。自定义的类装载器根据类的名称解析对应的Java包名,如 com.app.MainClass的包名解析为com.app。步骤2044、根据所述包名,从生成的索引文件中确定对应的jar文件。根据解析得到的包名,从生成的索引文件中查找该包对应的jar文件。根 据前面生成的索引文件可知com.app对应的jar文件为${PATH3}/C3.jar, com.eas.app对应的jar文件为${PATH1 }/Al.jar和S(PATH2)/B5.jar。
步骤2045、判断所述jar文件中是否包含对应的类文件,有则装载确定的 类文件。针对步骤2044中查找到的jar文件,查找该jar文件中是否包含对应的类 文件,查找到所述类文件则装载,否则进入步骤2046。步骤2046、针对下一个jar文件,查找该jar文件中是否包含对应的类文 件,进入步骤2045,重复此步骤,直至所述类文件装载成功。通过所述方法装载类文件,能够快速地找到类文件对应的jar文件,而避 免了按顺序循环查找,提高了系统启动时类文件的装载效率。参照图5,示出了本发明实施例类文件装载系统的结构框图,包括替换单元501,用于自定义一个类装载器替换Java虚拟机默认的系统类装 载器。通过在Java启动命令中设置自定义的类装载器,用所述自定义的类装载 器替换虚拟机默认的系统类装载器。Java虚拟机支持自定义方式扩展虚拟机查 找类文件的行为,所述自定义的类装载器继承自虚拟机的类装载器。自定义的 类装载器遵循java标准,但是重载了标准类装载器查找、装载类文件的方法。索引文件生成单元502,根据自定义的类装载器规则,生成java应用所需 jar文件的索引文件。初始化单元503,用于当Java虚拟机启动所述自定义的类装载器时,初始 化自定义类装载器。媳篮"、,n点用1^1点劲^太.在iiT.;f千;avfl frf)杀5庠泉J^"咖;甬"4cr^i";J7t,"f云4千java程序时^f吏用所述自定义的类装载器。第一装载单元504,用于自定义类装载器装载类文件。自定义的类装载器首先请求上一级的应用类装载器装载Java虚拟机自身 的标准组件,如果没有找到相关文件,则表示该类文件属于应用程序自己的jar 文件,则所述自定义类装载器根据生成的索引文件装载类文件。所述自定义的 类装栽器根据生成的索引文件查找对应的jar文件,从所述jar文件中确定要装 载的类文件,装载所述确定的类文件。参照图6,示出了图5中第一装载单元的组成结构图,包括请求单元601,用于请求上一级应用类装载器装载类文件。
判断单元602,用于判断上一级应用类装载器装载类文件是否成功。第二装载单元603,用于所述自定义类的类装载器才艮据索引文件装载类文件。如果判断单元602判断上一级应用类装载器装载不成功,则表示该类文件 属于应用程序自己的jar文件,则所述自定义类装载器启动第二装载单元才艮据 生成的索引文件装载类文件。由于图5、图6所示系统与图2、图3、图4所示方法对应,因此,为了 节约篇幅,系统中未详尽之处可参照方法中的相应部分。以上对本发明所提供的一种类文件装载方法和系统,进行了详细介绍,本明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技 术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处, 综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1、一种类文件装载方法,其特征在于,包括自定义一个类装载器替换java虚拟机默认的系统类装载器;根据自定义的类装载器规则,生成java应用所需jar文件的索引文件;Java虚拟机启动所述自定义的类装载器,初始化自定义类装载器;自定义类装载器装载类文件。
2、 如权利要求1所述类文件装载方法,其特征在于,所述自定义类装载 器装载类文件的具体步骤为自定义类装载器请求上一级的应用类装载器装载类文件,如果所述应用类 装载器装载不成功,贝'J:自定义类的类装载器才艮据所述索引文件装载类文件。
3、 如权利要求2所述类文件装载方法,其特征在于所述自定义的类装载器根据生成的索引文件查找对应的jar文件,从所述 jar文件中确定要装载的类文件,装载所述确定的类文件。
4、 如权利要求3所述类文件装载方法,其特征在于,还包括 根据类文件被自定义的类装载器装载的命中率緩存确定数量的jar文件句柄。
5、 如权利要求1所述类文件装载方法,其特征在于,所述自定义类装载 器装载类文件的具体步骤包括Java虚拟机通知自定义的类装载器要装载的类;自定义的类装载器请求上一级的应用类装载器装载所述类,如果装载不成 功,贝'J:自定义的类装载器解析该类对应的包名 根据所述包名,从生成的索引文件中确定对应的jar文件; 判断所述jar文件中是否包含对应的类文件,有则装载,否则 判断下一个jar文件中是否包含对应的类文件,重复上一步,完成类文件 的装载。
6、 如权利要求1所述类文件装载方法,其特征在于,所述生成java应用 所需jar文件的索引文件的具体步骤包括 扫描每个路径下的所有jar文件,根据每个jar文件中的每个目录生成该目 录到jar文件名的映射,在当前路径下生成索引文件。
7、 如权利要求6所述类文件装载方法,其特征在于,所述在当前路径下 生成索引文件的具体步骤包括打开第一/下一个路径; 逐个打开所述路径下的所有jar文件;递归查找所述打开的jar文件中的每个目录,如果该目录下包括类文件, 则生成该目录与jar文件的映射;根据所述生成的映射生成索引文件。
8、 根据权利要求1所述类文件装载方法,其特征在于,还包括当java应用所需的jar文件变化时,则重新生成Java应用所需jar文件的 索引文件。
9、 一种类文件装载系统,其特征在于,包括替换单元,用于自定义一个类装载器替换Java虚拟机默认的系统类装载器;索引文件生成单元,根据自定义的类装载器规则,生成Java应用所需jar 文件的索引文件;初始化单元,用于当Java虚拟机启动所述自定义的类装载器时,初始化 自定义类装载器;第一装载单元,用于自定义类装载器装载类文件。
10、 如权利要求9所述类装载系统,其特征在于,所述第一装载单元包括 请求单元,用于请求上一级应用类装载器装载类文件;判断单元,用于判断上一级应用类装载器装载类文件是否成功; 第二装载单元,用于所述自定义类的类装载器根据索引文件装载类文件。
全文摘要
本发明提供了一种类文件装载方法,包括步骤自定义一个类装载器替换java虚拟机默认的系统类装载器;根据自定义的类装载器规则,生成java应用所需jar文件的索引文件;Java虚拟机启动所述自定义的类装载器,初始化自定义类装载器;所述自定义类装载器请求上一级的应用类装载器装载类文件,如果所述应用类装载器装载不成功,则自定义类的类装载器根据所述索引文件装载类文件。本发明通过自定义类装载器替换虚拟机默认的系统类装载器,使用自定义的类装载器来装载类文件,提高了系统启动时类文件的装载效率。并且在装载大量的Jar文件时不会超出操作系统的文件句柄限制,且能与第三方系统集成。本发明还提供了一种类文件装载系统。
文档编号G06F9/445GK101126988SQ20071016389
公开日2008年2月20日 申请日期2007年10月11日 优先权日2007年10月11日
发明者游兴旺 申请人:金蝶软件(中国)有限公司