用于检测jar包冲突的方法及装置的制造方法

文档序号:9865188阅读:276来源:国知局
用于检测jar包冲突的方法及装置的制造方法
【技术领域】
[0001] 本申请涉及化va应用开发领域,具体涉及一种用于检测JAR包冲突的方法。本申 请同时提供一种用于检测JAR包冲突的装置。
【背景技术】
[0002] 化va是一种可W撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems公司于1995年5月推出的化va程序设计语言和化va平台(即 Jav址E, ^vaME, Java沈)的总称。采用化va语言进行应用程序的开发,首先要编写文件 后缀名为.java的源代码,然后通过编译器将源代码编译成与机器无关的二进制字节码 化ytecode),即;.class文件,运行时依赖各种不同平台的虚拟机(JVM)在预先设置的类加 载路径中查找并加载需要执行的类、并解释执行字节码程序,从而实现"一次编译、到处执 行"的跨平台特性。
[0003] 在一个应用项目的开发过程中,通常会涉及大量的class文件,为了便于存储和 使用,通常采用JAR包的形式。JAR (Java Archive的英文缩写)包是java的一种压缩包, 也可W认为是一系列class文件的集合,要在项目中使用某个JAR包时,需要在用于指定类 加载路径的相关参数(通常是classpath参数)中设置所述JAR包的路径,虚拟机就可W 在运行时动态加载所述JAR包中包含的类。
[0004] 基于化va的上述动态加载原理,如果在不同的JAR包中存在全限定名一样的 class (而送两个class本身并不一定完全相同),在源代码的编译阶段通常不会出现错误, 而虚拟机在运行化va代码的时候会加载其中一个class,送时可能就会发生某个方法调用 或者成员变量不存在的错误。针对送种情况,目前业界的做法是分析两个JAR包是否存在 全限定名一样的类来进行判断,即;如果两个JAR包中存在全限定名一样的类,就认为送两 个JAR包存在冲突。
[0005] 由此可见,现有技术可W解决因为类的全限定名相同导致的冲突,然而在实际应 用中,JAR包之间还可能存在不同于上述冲突的其他冲突,现有技术则无法解决,下面举例 进行说明。
[0006] 例如,在某个应用中引入了 a. jar和b. jar送两个JAR包,其中a. jar使用的 ClassX在b. jar中,后来根据应用需求的变更升级了 b. jar或者新引入的JAR包间接依赖 了不同版本的b. jar,从而导致系统当前使用的b. jar中ClassX不存在了,或者ClassX中 的某个方法签名发生了变更。由于a. jar和b. jar此前一起成功编译过,因此a. jar不会 感知到b. jar的上述变更,如果该应用的测试环节做的不够完善(没有发现ClassX不存 在,或者ClassX中的某个方法不存在),郝么在生产环境中可能会出现相应的错误,当应用 执行到需要加载ClassX或者需要调用ClassX中所述方法的分支时,故障就会出现。
[0007] 在上述例子中,由于a. jar和b. jar中不存在全限定名一样的class,因此现有技 术认为a. jar和b. jar不存在冲突,实际上a. jar所使用的ClassX或者ClassX中的某个方 法签名已经在b. jar中不存在或者发生了变更,也就是说送两个JAR包之间的依赖关系已 经不完备,无法保证使用送两个JAR包的应用程序正常运行,因此实际上也是存在冲突的, 但是现有技术无法提前检测送个问题,只能在故障发生之后再进行排查。

【发明内容】

[000引本申请提供一种用于检测JAR包冲突的方法,W解决现有技术因为无法检测JAR 包在依赖完备性方面的冲突,从而可能导致在运行时出现故障的问题。本申请另外提供一 种用于检测JAR包冲突的装置。
[0009] 本申请提供一种用于检测JAR包冲突的方法,包括:
[0010] 选择待进行冲突检测的JAR包;
[0011] 针对所述JAR包中的每个类,通过分析该类对应的字节码文件,检查在预先指定 的JAR包列表中是否存在与该类依赖的类对应的字节码文件、W及在被依赖类相关的字节 码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包 存在冲突;
[0012] 所述预先指定的JAR包列表是指,在预先设置的类加载路径下指定的JAR包列表; 所述该类依赖的类是指,该类依赖的、不属于JDK中的类。
[0013] 可选的,所述被依赖类相关的字节码文件包括;所述被依赖类对应的字节码文件、 所述被依赖类实现的接口对应的字节码文件、和所述被依赖类的超类对应的字节码文件;
[0014] 所述被访问的元素包括;被调用的成员方法、和被访问的成员变量。
[0015] 可选的,所述选择待进行冲突检测的JAR包包括:
[0016] 根据预先设置的JAR包名称进行选择;或者,
[0017] 根据用户当前指定的JAR包名称进行选择;或者,
[0018] 选择其名称与用户指定的关键字相匹配的JAR包,作为所述待进行冲突检测的 JAR 包。
[0019] 可选的,执行所述选择待进行冲突检测的JAR包后,首先执行下述筛选操作:
[0020] 针对所述JAR包中的每个类,通过分析该类对应的字节码文件中的常量池,判断 该类是否仅依赖本JAR包中的类和/或JDK中的类;若是,则将该类标识为"不进行冲突检 测";
[0021] 相应的,后续针对所述JAR包中的每个类,通过分析其对应的字节码文件执行检 查操作是指,针对未标识为"不进行冲突检测"的类执行所述操作。
[0022] 可选的,所述通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中 是否存在与该类依赖的类对应的字节码文件、W及在被依赖类相关的字节码文件中是否存 在被该类访问的元素,包括:
[0023] 通过分析所述字节码文件,分别针对该类自身、该类的每个成员变量、W及该类的 每个成员方法执行所述检查操作。
[0024] 可选的,所述通过分析所述字节码文件,针对该类自身执行所述检查操作,包括: [00巧]针对该类对应的注解类、实现的接口、W及继承的类,检查在预先指定的JAR包列 表中是否存在与之对应的字节码文件;
[0026] 检查该类使用到的所述注解类中的方法,是否在所述注解类对应的字节码文件中 存在。
[0027] 可选的,所述通过分析所述字节码文件,针对该类的每个成员变量执行所述检查 操作,包括:针对每个成员变量执行下述操作:
[0028] 针对所述成员变量对应的注解类、W及所述成员变量类型对应的类,检查在预先 指定的JAR包列表中是否存在与之对应的字节码文件;
[0029] 检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节 码文件中存在。
[0030] 可选的,所述通过分析所述字节码文件,针对该类的每个成员方法执行所述检查 操作,包括;针对每个成员方法执行下述操作:
[0031] 针对所述成员方法对应的注解类、W及所述成员方法参数对应的注解类,检查在 预先指定的JAR包列表中是否存在与之对应的字节码文件;
[0032] 检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的 字节码文件中存在;
[0033] 针对所述成员方法的返回值类型、参数类型W及抛出的异常类型对应的类,检查 在预先指定的JAR包列表中是否存在与之对应的字节码文件;
[0034] 针对所述成员方法内部字节码指令中的方法调用涉及的类,检查在预先指定的 JAR包列表中是否存在对应的字节码文件;检查所述方法调用使用到的方法签名,是否在 所述类相关的字节码文件中存在;
[0035] 针对所述成员方法内部字节码指令涉及的类型、类成员变量对应的类、异常控制 try-catch代码块中的异常类型、W及局部变量类型对应的类,检查在预先指定的JAR包列 表中是否存在与之对应的字节码文件;
[0036] 检查所述成员方法内字节码指令涉及的类成员变量,是否在所述类相关的字节码 文件中存在。
[0037] 可选的,在通过分析所述字节码文件进行检查的过程中,如果待查找的类和所述 字节码文件对应的类在同一个JAR包中,则跳过对所述待查找类W及该类中的成员方法和 /或成员变量的检查。
[0038] 可选的,所述方法还包括:
[0039] 汇总检测到的JAR包冲突,将其W错误日志的形式写入文件中,并将所述文件输 出。
[0040] 可选的,当所述检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的 字节码文件的检查结果为"存在"时,执行下述操作:
[0041] 检查被依赖类对应的字节码文件在所述预先指定的JAR包列表中是否唯一;
[0042] 若否,则视为所述JAR包依赖的该被依赖类存在唯一性冲突。
[0043] 可选的,所述方法还包括:
[0044] 汇总检测到的所述唯一性冲突,将其W警告日志的形式写入文件中,并将所述文 件输出。
[0045] 相应的,本申请还提供一种用于检测JAR包冲突的装置,包括:
[004引 JAR包选择单元,用于选择待进行冲突检测的JAR包;
[0047] JAR包检测单元,用于针对所述JAR包中的每个类,通过分析该类对应的字节码 文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、W及 在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存 在,则视为当前JAR包存在冲突。
[0048] 可选的,所述JAR包检测单元所检查的被依赖类相关的字节码文件包括;所述被 依赖类对应的字节码文件、所述被依赖类实现的接口对应的字节码文件、和所述被依赖类 的超类对应的字节码文件;所述JAR包检测单元所检查的所述被访问的元素包括;被调用 的成员方法、和被访问的成员变量。
[0049] 可选的,所述JAR包选择单元包括:
[0050] 缺省选择子单元,用于根据预先设置的JAR包名称进行选择;或者,
[0051] 指定选择子单元,用于根据用户当前指定的JAR包名称进行选择;或者,
[0052] 匹配选择子单元,用于选择其名称与用户指定的关键字相匹配的JAR包,作为所 述待进行冲突检测的JAR包。
[0053] 可选的,所述装置包括:
[0054] 类筛选单元,用于针对所述JAR包中的每个类,通过分析该类对应的字节码文件 中的常量池,判断该类是否仅依赖本JAR包的类和/或JDK中的类;若是,则将该类标识为 "不进行冲突检测";
[0055] 相应的,所述JAR包检测单元,具体用于针对未标识为"不进行冲突检测"的类执 行分析字节码W及相关的检查操作。
[0056] 可选的,所述JAR包检测单元包括:
[0057] 循环控制子单元,用于针对当前待检测JAR包中的
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1