CN105630463B - 用于检测jar包冲突的方法及装置 - Google Patents
用于检测jar包冲突的方法及装置 Download PDFInfo
- Publication number
- CN105630463B CN105630463B CN201410590017.7A CN201410590017A CN105630463B CN 105630463 B CN105630463 B CN 105630463B CN 201410590017 A CN201410590017 A CN 201410590017A CN 105630463 B CN105630463 B CN 105630463B
- Authority
- CN
- China
- Prior art keywords
- class
- jar
- conflict
- jar packet
- byte code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 231
- 238000001514 detection method Methods 0.000 claims abstract description 64
- 230000001419 dependent effect Effects 0.000 claims description 18
- 230000008569 process Effects 0.000 claims description 18
- 230000002159 abnormal effect Effects 0.000 claims description 15
- 238000012216 screening Methods 0.000 claims description 6
- 238000004458 analytical method Methods 0.000 claims description 5
- 238000007689 inspection Methods 0.000 abstract 1
- 238000012545 processing Methods 0.000 description 15
- 230000018109 developmental process Effects 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 238000011161 development Methods 0.000 description 5
- 230000008859 change Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000003491 array Methods 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 230000007812 deficiency Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000000007 visual effect Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 238000012790 confirmation Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000033772 system development Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 238000013024 troubleshooting Methods 0.000 description 1
Landscapes
- Stored Programmes (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请公开了一种用于检测JAR包冲突的方法,包括:选择待进行冲突检测的JAR包;针对所述JAR包中的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突。本申请同时提供一种用于检测JAR包冲突的装置。采用本申请提供的方法,能够自动检测出JAR包在依赖完备性方面的冲突,从而为提前采取升级JAR包等方式消除冲突提供了依据,可以有效避免在运行阶段因为依赖完备性的缺失而引发的故障。
Description
技术领域
本申请涉及Java应用开发领域,具体涉及一种用于检测JAR包冲突的方法。本申请同时提供一种用于检测JAR包冲突的装置。
背景技术
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE,JavaME,JavaSE)的总称。采用Java语言进行应用程序的开发,首先要编写文件后缀名为.java的源代码,然后通过编译器将源代码编译成与机器无关的二进制字节码(bytecode),即:.class文件,运行时依赖各种不同平台的虚拟机(JVM)在预先设置的类加载路径中查找并加载需要执行的类、并解释执行字节码程序,从而实现“一次编译、到处执行”的跨平台特性。
在一个应用项目的开发过程中,通常会涉及大量的class文件,为了便于存储和使用,通常采用JAR包的形式。JAR(Java Archive的英文缩写)包是java的一种压缩包,也可以认为是一系列class文件的集合,要在项目中使用某个JAR包时,需要在用于指定类加载路径的相关参数(通常是classpath参数)中设置所述JAR包的路径,虚拟机就可以在运行时动态加载所述JAR包中包含的类。
基于Java的上述动态加载原理,如果在不同的JAR包中存在全限定名一样的class(而这两个class本身并不一定完全相同),在源代码的编译阶段通常不会出现错误,而虚拟机在运行Java代码的时候会加载其中一个class,这时可能就会发生某个方法调用或者成员变量不存在的错误。针对这种情况,目前业界的做法是分析两个JAR包是否存在全限定名一样的类来进行判断,即:如果两个JAR包中存在全限定名一样的类,就认为这两个JAR包存在冲突。
由此可见,现有技术可以解决因为类的全限定名相同导致的冲突,然而在实际应用中,JAR包之间还可能存在不同于上述冲突的其他冲突,现有技术则无法解决,下面举例进行说明。
例如,在某个应用中引入了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中所述方法的分支时,故障就会出现。
在上述例子中,由于a.jar和b.jar中不存在全限定名一样的class,因此现有技术认为a.jar和b.jar不存在冲突,实际上a.jar所使用的ClassX或者ClassX中的某个方法签名已经在b.jar中不存在或者发生了变更,也就是说这两个JAR包之间的依赖关系已经不完备,无法保证使用这两个JAR包的应用程序正常运行,因此实际上也是存在冲突的,但是现有技术无法提前检测这个问题,只能在故障发生之后再进行排查。
发明内容
本申请提供一种用于检测JAR包冲突的方法,以解决现有技术因为无法检测JAR包在依赖完备性方面的冲突,从而可能导致在运行时出现故障的问题。本申请另外提供一种用于检测JAR包冲突的装置。
本申请提供一种用于检测JAR包冲突的方法,包括:
选择待进行冲突检测的JAR包;
针对所述JAR包中的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突;
所述预先指定的JAR包列表是指,在预先设置的类加载路径下指定的JAR包列表;所述该类依赖的类是指,该类依赖的、不属于JDK中的类。
可选的,所述被依赖类相关的字节码文件包括:所述被依赖类对应的字节码文件、所述被依赖类实现的接口对应的字节码文件、和所述被依赖类的超类对应的字节码文件;
所述被访问的元素包括:被调用的成员方法、和被访问的成员变量。
可选的,所述选择待进行冲突检测的JAR包包括:
根据预先设置的JAR包名称进行选择;或者,
根据用户当前指定的JAR包名称进行选择;或者,
选择其名称与用户指定的关键字相匹配的JAR包,作为所述待进行冲突检测的JAR包。
可选的,执行所述选择待进行冲突检测的JAR包后,首先执行下述筛选操作:
针对所述JAR包中的每个类,通过分析该类对应的字节码文件中的常量池,判断该类是否仅依赖本JAR包中的类和/或JDK中的类;若是,则将该类标识为“不进行冲突检测”;
相应的,后续针对所述JAR包中的每个类,通过分析其对应的字节码文件执行检查操作是指,针对未标识为“不进行冲突检测”的类执行所述操作。
可选的,所述通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素,包括:
通过分析所述字节码文件,分别针对该类自身、该类的每个成员变量、以及该类的每个成员方法执行所述检查操作。
可选的,所述通过分析所述字节码文件,针对该类自身执行所述检查操作,包括:
针对该类对应的注解类、实现的接口、以及继承的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查该类使用到的所述注解类中的方法,是否在所述注解类对应的字节码文件中存在。
可选的,所述通过分析所述字节码文件,针对该类的每个成员变量执行所述检查操作,包括:针对每个成员变量执行下述操作:
针对所述成员变量对应的注解类、以及所述成员变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
可选的,所述通过分析所述字节码文件,针对该类的每个成员方法执行所述检查操作,包括:针对每个成员方法执行下述操作:
针对所述成员方法对应的注解类、以及所述成员方法参数对应的注解类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的字节码文件中存在;
针对所述成员方法的返回值类型、参数类型以及抛出的异常类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
针对所述成员方法内部字节码指令中的方法调用涉及的类,检查在预先指定的JAR包列表中是否存在对应的字节码文件;检查所述方法调用使用到的方法签名,是否在所述类相关的字节码文件中存在;
针对所述成员方法内部字节码指令涉及的类型、类成员变量对应的类、异常控制try-catch代码块中的异常类型、以及局部变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查所述成员方法内字节码指令涉及的类成员变量,是否在所述类相关的字节码文件中存在。
可选的,在通过分析所述字节码文件进行检查的过程中,如果待查找的类和所述字节码文件对应的类在同一个JAR包中,则跳过对所述待查找类以及该类中的成员方法和/或成员变量的检查。
可选的,所述方法还包括:
汇总检测到的JAR包冲突,将其以错误日志的形式写入文件中,并将所述文件输出。
可选的,当所述检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件的检查结果为“存在”时,执行下述操作:
检查被依赖类对应的字节码文件在所述预先指定的JAR包列表中是否唯一;
若否,则视为所述JAR包依赖的该被依赖类存在唯一性冲突。
可选的,所述方法还包括:
汇总检测到的所述唯一性冲突,将其以警告日志的形式写入文件中,并将所述文件输出。
相应的,本申请还提供一种用于检测JAR包冲突的装置,包括:
JAR包选择单元,用于选择待进行冲突检测的JAR包;
JAR包检测单元,用于针对所述JAR包中的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突。
可选的,所述JAR包检测单元所检查的被依赖类相关的字节码文件包括:所述被依赖类对应的字节码文件、所述被依赖类实现的接口对应的字节码文件、和所述被依赖类的超类对应的字节码文件;所述JAR包检测单元所检查的所述被访问的元素包括:被调用的成员方法、和被访问的成员变量。
可选的,所述JAR包选择单元包括:
缺省选择子单元,用于根据预先设置的JAR包名称进行选择;或者,
指定选择子单元,用于根据用户当前指定的JAR包名称进行选择;或者,
匹配选择子单元,用于选择其名称与用户指定的关键字相匹配的JAR包,作为所述待进行冲突检测的JAR包。
可选的,所述装置包括:
类筛选单元,用于针对所述JAR包中的每个类,通过分析该类对应的字节码文件中的常量池,判断该类是否仅依赖本JAR包的类和/或JDK中的类;若是,则将该类标识为“不进行冲突检测”;
相应的,所述JAR包检测单元,具体用于针对未标识为“不进行冲突检测”的类执行分析字节码以及相关的检查操作。
可选的,所述JAR包检测单元包括:
循环控制子单元,用于针对当前待检测JAR包中的每个类,依次触发下述类检查子单元、成员变量检查子单元以及成员方法检查子单元进行检测;
类检查子单元,用于通过分析当前待检测类的字节码文件,对该类自身进行检查;
成员变量检查子单元,用于通过分析当前待检测类的字节码文件,对该类的每个成员变量进行检查;
成员方法检查子单元,用于通过分析当前待检测类的字节码文件,对该类的每个成员方法进行检查。
可选的,所述类检查子单元具体用于,针对该类对应的注解类、实现的接口、以及继承的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查该类使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
可选的,所述成员变量检查子单元具体用于,针对每个成员变量,针对所述成员变量对应的注解类、以及所述成员变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
可选的,所述成员方法检查子单元具体用于,针对每个成员方法,针对所述成员方法对应的注解类、以及所述成员方法参数对应的注解类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的字节码文件中存在;针对所述成员方法的返回值类型、参数类型以及抛出的异常类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;针对所述成员方法内部字节码指令中的方法调用涉及的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述方法调用使用到的方法签名,是否在所述类相关的字节码文件中存在;针对所述成员方法内部字节码指令涉及的类型、类成员变量对应的类、异常控制try-catch代码块中的异常类型、以及局部变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员方法内字节码指令涉及的类成员变量,是否在所述类相关的字节码文件中存在。
可选的,所述JAR包检测单元还包括:
相同JAR包判断子单元,用于判断待查找的类和所述字节码文件对应的类是否在同一个JAR包中,如果是,则不用执行对所述待查找类以及该类中的成员方法和/或成员变量的检查。
可选的,所述装置还包括:
检测结果输出单元,用于汇总检测到的JAR包冲突,将其以错误日志的形式写入文件中,并将所述文件输出。
可选的,所述JAR包检测单元还包括:
唯一性检测子单元,用于检查被依赖类对应的字节码文件在所述预先指定的JAR包列表中是否唯一,若检查结果为否,则视为所述JAR包依赖的该被依赖类存在唯一性冲突。
可选的,所述还包括:
警告结果输出单元,用于汇总检测到的所述唯一性冲突,将其以警告日志的形式写入文件中,并将所述文件输出。
与现有技术相比,本申请具有以下优点:
本申请提供的用于检测JAR包冲突的方法,针对待检测JAR包中的每个类,通过分析其对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在所述被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突。采用上述方法,能够自动检测出JAR包在依赖完备性方面的冲突,从而为提前采取升级JAR包等方式消除冲突提供了依据,可以有效避免在运行阶段因为依赖完备性的缺失而引发的故障。
附图说明
图1是本申请的一种用于检测JAR包冲突的方法的实施例的流程图;
图2是本申请实施例提供的针对JAR包中经过筛选后的每个类进行检查的处理流程图;
图3是本申请的一种用于检测JAR包冲突的装置的实施例的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
在本申请中,分别提供了一种用于检测JAR包冲突的方法,以及一种用于检测JAR包冲突的装置,在下面的实施例中逐一进行详细说明。
请参考图1,其为本申请的一种用于检测JAR包冲突的方法的实施例的流程图。所述方法包括如下步骤:
步骤101:选择待进行冲突检测的JAR包。
在Java应用中通常包含多个引入的JAR包,这些JAR包放在预先设置的类加载路径中,彼此之间可能存在依赖关系(例如:某个JAR包中的类依赖另一个JAR包中的类),如果这些依赖关系是完备的,那么在运行阶段,虚拟机就能够自动从所述类加载路径中加载所需的类并进行解释执行。当其中某个JAR包进行了变更或者引入了新的JAR包后,可能会导致某个JAR包的依赖完备性被破坏(例如:该JAR包所依赖的类或者类中的方法不存在了),那么在运行阶段就可能出现故障。如果某个JAR包所依赖的类或者类中的元素(成员变量或者成员方法)不存在了,即为本申请所述的JAR包存在冲突(为了与由多个全限定名相同的类所引起的JAR包冲突相区分,本申请中将后者称为唯一性冲突)。
为了解决上述问题,本申请的技术方案提供了对JAR包进行冲突检测的方法,针对待检测的JAR包中的每个类,从其字节码文件(即.class文件)中获取该类依赖的类以及类中被访问的元素,并检查被依赖的类是否在预先设置的类加载路径下的JAR包中存在,以及所述被访问的元素是否在被依赖类的字节码文件中存在;如果上述任一检查结果为不存在,则认为当前JAR包存在冲突。
在实现本申请技术方案的过程中,可以先执行本步骤选择待进行冲突检测的JAR包,具体说,可以采取如下所述的三种方式中的一种进行选择:
1)由用户预先设置一个或者多个缺省要进行冲突检测的JAR包,本步骤根据预先设置的缺省配置进行选择。
2)接收用户通过命令行或者是可视化窗口界面输入的要进行冲突检测的JAR包名称,即:根据用户当前的输入进行选择。
3)接收用户通过命令行或者是可视化窗口界面输入的一个或者多个关键字,然后将待选择的JAR包(通常是当前Java应用中的JAR包)的名称与所述关键字相匹配,并将匹配成功的JAR包选作要进行后续冲突检测的JAR包。
步骤102:从所述JAR包中筛选需要进行检测的类。
为了提高本方法的执行效率,本步骤从步骤101所选的JAR包中筛选需要进行检测的类。本步骤的处理过程以及后续步骤103的处理过程,都是在对字节码文件进行分析的基础上进行的,为了便于理解,先对字节码文件的基本结构作简要说明。
所述字节码文件是指Java源代码编译后生成的.class文件,Java源代码中的每个类(class)都会生成与之对应的字节码文件,也称class文件。Class文件是由JVM能够识别的特定格式的字节流组成的二进制文件。该文件的基本结构如表一所示:
表一:class文件格式
其中,常量池主要用于将本class文件涉及到的一些相同类型的值通过索引的方式集中组织在一起,避免了在不同地方有不同拷贝,从而缩减字节码的大小。常量池存储了诸如常量字符串、基本数据类型的字面值、以及类名称、接口名称、方法名称的字符串信息等内容。JVM会为每一个常量构成一个常量表,而class文件会根据常量表在常量池中的位置对其进行索引。例如:在某个class文件中,第一个常量池表项中的tag字段表明自己是一个CONSTANT_Class结构的常量池表项,name_index索引字段的值为2,表明指向第二个常量池表项,在所述第二个常量池表项中则采用字符串的形式存储了该class文件对应的类的全限定名。class文件的格式属于现有技术,因此不在此作详细介绍。
在本步骤中,针对所述JAR包中的每个类,解析该类对应的字节码文件中的常量池数据,从中提取该类引用(即:依赖)的所有类,然后判断这些类是否都是本JAR包或者JDK中的类,如果是,则不用针对该类进行分析,由编译器保证不会出现类找不到或者方法、成员变量不存在的问题。其中,JDK(Java开发工具包—Java Development kit的英文缩写)是指Oracle公司对Java开发人员发布的免费软件开发工具包,其中包含了多个用于Java开发的组件和各种类库。
在具体实施中,从常量池提取某个类的全限定名称后,可以使用JVM提供的扩展类加载器(Extension ClassLoader)尝试加载,如果加载成功,则说明该类是JDK中的类。
至于判断是否是当前JAR包中的类,可以预先将所述JAR包展开,并将其中包含的类的全限定名都提取出来,存储在一个文件中,然后在本步骤中从常量池提取某个类的全限定名后,在上述文件中查找该全限定名是否存在,如果存在则说明该类是所述JAR包中的一个类。
采用上述检查方式,如果所述JAR包中的某个类,其字节码常量池仅引用所述JAR包内的或者是JDK中的类,那么将该类标识为“不进行冲突检测”,在后续的步骤103中,仅针对本步骤筛选出的未添加上述标识的类进行冲突检测即可,可以提高本方法的执行效率。
步骤103:针对所述JAR包中经过筛选后的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突。
所述预先指定的JAR包列表是指,在预先设置的类加载路径下指定的JAR包列表,所述类加载路径通常是指系统变量classPath中指明的路径。在实际的Java应用中,可以将与项目相关的JAR包放在classPath中的某个具体路径下,本步骤就会在预先设置好的该路径下的JAR包中查找所需的class文件。
所述JAR包中某个类依赖的类是指,该类依赖的、不属于JDK中的类,因为JDK中的类,是由系统开发平台提供的,由系统保证是能够动态加载成功的,因此对这部分类不用进行检查,在后面的处理中不再进行重复说明(关于如何判断是否为JDK的类,请参见步骤102中的说明)。
本步骤针对当前待检测JAR包中经过筛选后的每个类(以下称为待检测类),从该类自身、该类的每个成员变量、以及该类的每个成员方法三个方面进行检查,为了便于描述,这里结合附图2以步骤103-1至103-3的形式进行说明,在实际实施中并没有先后顺序的强制要求。
步骤103-1:通过分析字节码文件,对待检测类自身进行检查。
1)检查待检测类对应的注解类、实现的接口、以及继承的类,是否在预先指定的JAR包列表中存在与之对应的字节码文件。
从所述待检测类的字节码文件中提取对应的注解类、实现的接口(在Java中接口也是一种特殊的类)、以及继承的类的全限定名,然后在预先指定的类加载路径中的JAR包列表中查找与之对应的字节码文件,如果找到,则说明该类是存在的,不会在运行阶段因为加载失败而引发故障。
具体实现中,可以按照字节码文件的格式自行分析并获取上述各个类的信息,例如:根据super class项中存储的索引,从常量池中获取所述继承的类的全限定名,并在所述JAR包列表中查找与之对应的字节码文件。
由于字节码文件是二进制文件,解析过程相对繁琐,为了简化该处理过程,也可以使用Java的字节码工具ASM(ASM是由ObjectWeb consortium提供的用于分析,修改和生成JVM字节码的Java API类库)从所述字节码文件中直接提取需要的信息,然后进行后续的查找操作。例如:使用ASM工具直接从所述字节码文件中提取待检测类上的注解类的相关信息。
至于在所述JAR包列表中查找对应的字节码文件的过程,也可以采用步骤102类似的方式,即:先将JAR包列表中的所有JAR包依次展开,并将每个JAR中包含的类的全限定名提取出来,并存储在一个文件中。那么,在本步骤的查找过程中,直接在该文件中查找对应的注解类、接口类或者继承的类的全限定名即可。
如果在预先指定的JAR包列表中未能找到对应的字节码文件,就说明待检测类的依赖关系不完备,所述JAR包存在冲突,可以将相关冲突信息记录下来,例如:当前检测的JAR包名称、所述待检测类的类名、未能找到对应的字节码文件的注解类、接口类或者继承类的类名。
2)检查待检测类使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
如果在上述处理中,在预先指定的JAR包列表中找到了所述待检测类的注解类的字节码文件,那么在本步骤中就可以继续检查所述待检测类使用到的所述注解类中的方法,是否在该文件中存在。
具体说,与上述1)中的处理方式类似,可以按照待检测类的字节码文件的格式进行解析,并从中获取待检测类使用到的所述注解类中的方法的描述符信息,其中记录了方法的名称、参数、返回值等内容;也可以在使用ASM工具从所述待检测类的字节码文件中提取待检测类上的注解类信息时,一并提取使用到的注解类中的方法的相关信息。然后,通过对所述注解类的字节码文件中methods项的解析、或者利用ASM工具从所述注解类的字节码文件中提取所述注解类中的方法描述符信息,并且在其中查找被待检类使用到的方法是否存在。
如果没有找到,就说明待检测类的依赖关系不完备,所述JAR包存在冲突,可以将相关冲突信息记录下来,例如:当前检测的JAR包名称、所述待检测类的类名、注解类的类名、以及未能在注解类中找到的方法的描述信息。
本步骤经过上述1)和2)的分析与查找过程,针对待检测类自身,检查了其依赖的类是否在类加载路径中存在,以及调用的方法是否在对应的类中存在,完成了对待检测类自身的冲突检测过程。
步骤103-2:通过分析字节码文件,对待检测类的每个成员变量进行检查。
本步骤针对待检测类的每个成员变量进行检查,基本的处理过程与步骤103-1是类似的,相同的部分不再赘述,下面重点描述不同之处。针对待检测类的每个成员变量进行下述检查:
1)检查所述成员变量对应的注解类、以及所述成员变量类型对应的类,是否在预先指定的JAR包列表中存在与之对应的字节码文件。
采用步骤103-1类似的方式,通过解析字节码文件或者采用ASM工具,从所述待检测类的字节码文件中获取所述成员变量对应的注解类的全限定名,并在预先指定的类加载路径中的JAR包列表中查找与之对应的字节码文件。
类似的,从所述待检测类的字节码文件中获取所述成员变量的类型,如果所述类型是Java的基本数据类型,则不需要进行后续的查找处理,否则在预先指定的类加载路径中的JAR包列表中查找与之对应的字节码文件。
与步骤103-1类似,可以根据查找结果,记录必要的冲突信息。
2)检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
与步骤103-1中的处理方式类似,可以按照字节码文件的格式进行解析,也可以使用ASM工具从所述待检测类的字节码文件中提取所述成员变量使用到的注解类中的方法的相关信息。然后,通过对所述注解类的字节码文件中methods项的解析,或者利用ASM工具从所述注解类的字节码文件中提取所述注解类的方法描述符信息,并且在其中查找所述成员变量使用到的方法是否存在。
与步骤103-1类似,可以根据查找结果,记录必要的冲突信息。
本步骤针对待检测类中的每个成员变量,采用上述1)和2)所述的过程进行分析与查找,检查其依赖的类是否在类加载路径中存在,以及调用的方法是否在对应的类中存在,完成了对待检测类中的成员变量的冲突检测过程。
步骤103-3:通过分析字节码文件,对所述类的每个成员函数进行检查。
本步骤针对待检测类的每个成员函数进行检查,与步骤103-1和步骤103-2相同的部分不再赘述,下面重点描述不同之处。本步骤针对待检测类的每个成员函数进行下述检查:
1)检查所述成员方法对应的注解类、以及所述成员方法参数对应的注解类,是否在预先指定的JAR包列表中存在与之对应的字节码文件。
采用步骤103-1类似的方式,通过解析字节码文件或者采用ASM工具,从所述待检测类的字节码文件中获取所述成员方法对应的注解类的全限定名、以及所述成员方法参数对应的注解类的全限定名,并在预先指定的类加载路径中的JAR包列表中查找与之对应的字节码文件。
2)检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的字节码文件中存在。
与步骤103-1中的处理方式类似,可以按照字节码文件的格式进行解析,也可以使用ASM工具从所述待检测类的字节码文件中提取所述成员方法使用到的注解类中的方法的相关信息。然后,在所述注解类的字节码文件中,查找所述成员方法使用到的注解类中的方法是否存在。
3)检查所述成员方法的返回值类型、参数类型以及抛出的异常类型对应的类,是否在预先指定的JAR包列表中存在与之对应的字节码文件。
字节码文件的methods数组中记录了相应类的所有成员方法,通过每个数组成员中的descriptor_index索引可以从常量池中获取成员方法的描述符信息,包括:成员方法的名称、返回值类型、参数类型等;而每个数组成员中的Exceptions Attribute(异常属性)项则记录了当前方法抛出的异常类型。
可以按照上面描述的字节码文件的格式进行解析,也可以使用ASM工具从所述待检测类的字节码文件中提取所述成员方法的返回值类型、参数类型以及抛出的异常类型,如果所述类型不是Java的基本数据类型、也不是JDK中的类、也不在当前进行冲突检测的JAR包中,则在预先指定的类加载路径中的JAR包列表中查找与之对应的字节码文件是否存在。
4)针对所述成员方法内部的字节码指令进行检查。
本步骤针对所述成员方法内部的字节码指令进行分析和检查。字节码文件结构中的methods数组记录了对应类的所有成员方法,每个数组成员中的Code Attribute(代码属性)项包含了一个成员方法的栈、局部变量、存放字节码的字节码数组(code[])、异常处理代码对应的异常表、以及和代码相关的Attribute信息,其中Attribute信息中的LocalVariableTable Attribute等包含用于调试的局部变量表信息。本步骤中就是要对上述内容进行分析,并进行相应的查找操作。下面分别进行说明。
根据字节码指令中的操作码类型,判断某条指令是否为方法调用指令,并获取该方法调用涉及的类的全限定名,在预先指定的JAR包列表中查找是否存在与之对应的字节码文件;如果存在,继续检查在该类的字节码文件中是否存在所述方法调用使用到的方法签名,如果没有找到,则采用递归的方式从该类的字节码文件中提取继承的类以及实现的接口,并在对应的字节码文件中查找所述方法签名是否存在。
针对带有类型的字节码指令涉及的类型,load/store指令涉及的类成员变量对应的类、异常控制try{}-catch{}代码块中的异常类型、以及局部变量表中的局部变量的类型,获取上述类型对应类的全限定名,然后在预先指定的JAR包列表中查找是否存在与之对应的字节码文件。
对于涉及类成员变量的load/store指令,如果在上述处理中找到了该类的字节码文件,则继续在该字节码文件中查找所述成员变量是否存在,如果不存在,则采用递归的方式,从该类的字节码文件中提取继承的类以及实现的接口,并在对应的字节码文件中继续查找所述成员变量是否存在。
本步骤针对待检测类中的每个成员函数,采用上述1)至4)所述的过程进行分析与查找,检查其依赖的类是否在类加载路径中存在,以及其访问的各个元素(包括:方法和成员变量)是否在对应的类中存在,从而完成了对待检测类中的成员函数的冲突检测过程。
需要说明的是,为了提高本方法的执行效率,在本步骤103通过分析所述字节码文件进行检查的过程中,如果某个待查找类和所述待检测类在同一个JAR包中,则可以跳过对所述待查找类以及该类中的成员方法和/或成员变量的检查,因为编译器可以保证该类以及类中的成员方法或者成员变量一定是存在的。
针对当前检测的JAR包中的每个类,采用上述步骤103-1至103-3进行检查,并记录检查过程的冲突信息,至此就完成了对所述JAR包的冲突检测;如果在步骤101中选择的待检测JAR包有多个,则采用上述方式依次对每个待检测JAR包中的类进行检查,从而完成对所有JAR包的冲突检测。
通过上述冲突检测过程,完成了对JAR包的依赖完备性的检测,即:检测JAR包所依赖的类是否在预先指定的类加载路径中存在、以及被访问的类中的元素是否在相关的字节码文件中存在。
作为一种完善的技术方案,还可以进一步检测JAR包是否存在全限定名相同的冲突,具体说,在上述检测过程中,如果在预先指定的JAR包列表中找到了与待检测类依赖的类对应的字节码文件,则可以进一步检查所述字节码文件在预先指定的JAR包列表中是否唯一,即:在预先指定的JAR包列表中是否存在两个或者两个以上全限定名相同的被依赖类,若存在,则认为该被依赖类存在唯一性冲突。可以将相关冲突信息记录下来,例如:当前检测JAR包的名称、所述待检测类的类名、被依赖类的类名、以及包含全限定名相同的被依赖类的JAR包名称等。
步骤104:汇总检测到的JAR包冲突,将其以错误日志的形式写入文件中,并将所述文件输出。
如果在步骤103中检测到某个或某些JAR包存在冲突,即:在预先设定的JAR包列表中不存在所述JAR包依赖的类、或者在被依赖类中不存在需要访问的成员方法或成员变量,在本步骤中可以将检测到的冲突及记录的相关信息汇总起来,写入冲突文件并输出,供相关开发人员参考。如果在依赖完备性方面存在冲突,很可能会导致代码在运行阶段出现故障(访问所需的类或者方法、变量时报错),因此可以在所述冲突文件中将上述冲突检测信息的相应类型标注为:错误(例如:fatal error),以提醒开发人员重视该冲突并进行相应的处理,例如:升级相应的JAR包,以保证依赖的完备性。
如果在步骤103中不仅进行了上述关于依赖完备性的冲突检测,还进行了针对唯一性的冲突检测,在本步骤中可以一并将检测到的唯一性冲突及记录的相关信息汇总起来,写入上述冲突文件并输出,供相关开发人员参考。由于这种全限定名相同导致的唯一性冲突,并不一定会导致代码在运行阶段出现故障,因此可以将这种冲突检测信息的相应类型标注为:警告(warning),提醒开发人员进行必要的检查和确认,以避免在运行阶段出现故障。
所述冲突文件可以是数据表格文件,也可以是html文件等,只要能够存储汇总的冲突信息并根据需要显示所述信息即可。
至此,通过上述步骤101-104描述了本申请技术方案的处理过程。需要说明的是,本实施例提供的上述处理过程是一种优选实施方式,在其他的实施方式中,上述步骤并非都是必需的。例如,步骤102从待进行冲突检测的JAR包中筛选需要检测的类,是为了提高本方法的执行效率,在具体的应用中,如果所述JAR包中包含的类并不多,可以不执行本步骤而是直接执行步骤103针对JAR包中的每个类进行冲突检测,同样可以实现本申请的技术方案;步骤104也不是必须的步骤,本申请提供的是一种检测方法,只要完成了冲突检测过程即可,至于如何利用冲突检测结果,不是本申请的核心,在具体实施中,可以发出告警提示、存储在内存中、在屏幕上显示,或者将冲突检测结果作为另一个代码维护工具的输入等都是可以的,本申请对此并不做具体的限定。
综上所述,本申请提供的用于检测JAR包冲突的方法,针对待检测JAR包中的每个类,通过分析其对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突。采用上述方法,能够自动检测出JAR包在依赖完备性方面存在的冲突,从而为提前采取升级JAR包等方式消除冲突提供了依据,可以有效避免在运行阶段因为依赖完备性的缺失而引发的故障。
在上述的实施例中,提供了一种用于检测JAR包冲突的方法,与之相对应的,本申请还提供一种用于检测JAR包冲突的装置。请参看图3,其为本申请的一种用于检测JAR包冲突的装置的实施例示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种用于检测JAR包冲突的装置,包括:JAR包选择单元301,用于选择待进行冲突检测的JAR包;类筛选单元302,用于针对所述JAR包中的每个类,通过分析该类对应的字节码文件中的常量池,判断该类是否仅依赖本JAR包的类和/或JDK中的类;若是,则将该类标识为“不进行冲突检测”;JAR包检测单元303,用于针对所述JAR包中经过筛选后的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突;检测结果输出单元304,用于汇总检测到的JAR包冲突,将其以错误日志的形式写入文件中,并将所述文件输出。
可选的,所述JAR包检测单元所检查的被依赖类相关的字节码文件包括:所述被依赖类对应的字节码文件、所述被依赖类实现的接口对应的字节码文件、和所述被依赖类的超类对应的字节码文件;所述JAR包检测单元所检查的所述被访问的元素包括:被调用的成员方法、和被访问的成员变量。
可选的,所述JAR包选择单元包括:
缺省选择子单元,用于根据预先设置的JAR包名称进行选择;或者,
指定选择子单元,用于根据用户当前指定的JAR包名称进行选择;或者,
匹配选择子单元,用于选择其名称与用户指定的关键字相匹配的JAR包,作为所述待进行冲突检测的JAR包。
可选的,所述JAR包检测单元包括:
循环控制子单元,用于针对当前待检测JAR包中的每个类,依次触发下述类检查子单元、成员变量检查子单元以及成员方法检查子单元进行检测;
类检查子单元,用于通过分析当前待检测类的字节码文件,对该类自身进行检查;
成员变量检查子单元,用于通过分析当前待检测类的字节码文件,对该类的每个成员变量进行检查;
成员方法检查子单元,用于通过分析当前待检测类的字节码文件,对该类的每个成员方法进行检查。
可选的,所述类检查子单元具体用于,针对该类对应的注解类、实现的接口、以及继承的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查该类使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
可选的,所述成员变量检查子单元具体用于,针对每个成员变量,针对所述成员变量对应的注解类、以及所述成员变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
可选的,所述成员方法检查子单元具体用于,针对每个成员方法,针对所述成员方法对应的注解类、以及所述成员方法参数对应的注解类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的字节码文件中存在;针对所述成员方法的返回值类型、参数类型以及抛出的异常类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;针对所述成员方法内部字节码指令中的方法调用涉及的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述方法调用使用到的方法签名,是否在所述类相关的字节码文件中存在;针对所述成员方法内部字节码指令涉及的类型、类成员变量对应的类、异常控制try-catch代码块中的异常类型、以及局部变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员方法内字节码指令涉及的类成员变量,是否在所述类相关的字节码文件中存在。
可选的,所述JAR包检测单元还包括:
相同JAR包判断子单元,用于判断待查找的类和所述字节码文件对应的类是否在同一个JAR包中,如果是,则不用执行对所述待查找类以及该类中的成员方法和/或成员变量的检查。
可选的,所述JAR包检测单元还包括:
唯一性检测子单元,用于检查被依赖类对应的字节码文件在所述预先指定的JAR包列表中是否唯一,若检查结果为否,则视为所述JAR包依赖的该被依赖类存在唯一性冲突。
可选的,所述装置还包括:
警告结果输出单元,用于汇总检测到的所述唯一性冲突,将其以警告日志的形式写入文件中,并将所述文件输出。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
Claims (24)
1.一种用于检测JAR包冲突的方法,其特征在于,包括:
选择待进行冲突检测的JAR包;
针对所述JAR包中的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突;
所述预先指定的JAR包列表是指,在预先设置的类加载路径下指定的JAR包列表;所述该类依赖的类是指,该类依赖的、不属于JDK中的类;
所述被依赖类相关的字节码文件包括:所述被依赖类对应的字节码文件、所述被依赖类实现的接口对应的字节码文件、所述被依赖类的超类对应的字节码文件。
2.根据权利要求1所述的用于检测JAR包冲突的方法,其特征在于,所述被访问的元素包括:被调用的成员方法、被访问的成员变量。
3.根据权利要求2所述的用于检测JAR包冲突的方法,其特征在于,所述选择待进行冲突检测的JAR包包括:
根据预先设置的JAR包名称进行选择;或者,
根据用户当前指定的JAR包名称进行选择;或者,
选择其名称与用户指定的关键字相匹配的JAR包,作为所述待进行冲突检测的JAR包。
4.根据权利要求2所述的用于检测JAR包冲突的方法,其特征在于,执行所述选择待进行冲突检测的JAR包后,首先执行下述筛选操作:
针对所述JAR包中的每个类,通过分析该类对应的字节码文件中的常量池,判断该类是否仅依赖本JAR包中的类和/或JDK中的类;若是,则将该类标识为“不进行冲突检测”;
相应的,后续针对所述JAR包中的每个类,通过分析其对应的字节码文件执行检查操作是指,针对未标识为“不进行冲突检测”的类执行所述操作。
5.根据权利要求4所述的用于检测JAR包冲突的方法,其特征在于,所述通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素,包括:
通过分析所述字节码文件,分别针对该类自身、该类的每个成员变量、以及该类的每个成员方法执行所述检查操作。
6.根据权利要求5所述的用于检测JAR包冲突的方法,其特征在于,所述通过分析所述字节码文件,针对该类自身执行所述检查操作,包括:
针对该类对应的注解类、实现的接口、以及继承的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查该类使用到的所述注解类中的方法,是否在所述注解类对应的字节码文件中存在。
7.根据权利要求5所述的用于检测JAR包冲突的方法,其特征在于,所述通过分析所述字节码文件,针对该类的每个成员变量执行所述检查操作,包括:针对每个成员变量执行下述操作:
针对所述成员变量对应的注解类、以及所述成员变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
8.根据权利要求5所述的用于检测JAR包冲突的方法,其特征在于,所述通过分析所述字节码文件,针对该类的每个成员方法执行所述检查操作,包括:针对每个成员方法执行下述操作:
针对所述成员方法对应的注解类、以及所述成员方法参数对应的注解类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的字节码文件中存在;
针对所述成员方法的返回值类型、参数类型以及抛出的异常类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
针对所述成员方法内部字节码指令中的方法调用涉及的类,检查在预先指定的JAR包列表中是否存在对应的字节码文件;检查所述方法调用使用到的方法签名,是否在所述类相关的字节码文件中存在;
针对所述成员方法内部字节码指令涉及的类型、类成员变量对应的类、异常控制try-catch代码块中的异常类型、以及局部变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;
检查所述成员方法内字节码指令涉及的类成员变量,是否在所述类相关的字节码文件中存在。
9.根据权利要求5所述的用于检测JAR包冲突的方法,其特征在于,在通过分析所述字节码文件进行检查的过程中,如果待查找的类和所述字节码文件对应的类在同一个JAR包中,则跳过对所述待查找类以及该类中的成员方法和/或成员变量的检查。
10.根据权利要求1所述的用于检测JAR包冲突的方法,其特征在于,还包括:
汇总检测到的JAR包冲突,将其以错误日志的形式写入文件中,并将所述文件输出。
11.根据权利要求10所述的用于检测JAR包冲突的方法,其特征在于,当所述检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件的检查结果为“存在”时,执行下述操作:
检查被依赖类对应的字节码文件在所述预先指定的JAR包列表中是否唯一;
若否,则视为所述JAR包依赖的该被依赖类存在唯一性冲突;
所述唯一性冲突是指由多个全限定名相同的类所引起的JAR包冲突。
12.根据权利要求11所述的用于检测JAR包冲突的方法,其特征在于,还包括:
汇总检测到的所述唯一性冲突,将其以警告日志的形式写入文件中,并将所述文件输出。
13.一种用于检测JAR包冲突的装置,其特征在于,包括:
JAR包选择单元,用于选择待进行冲突检测的JAR包;
JAR包检测单元,用于针对所述JAR包中的每个类,通过分析该类对应的字节码文件,检查在预先指定的JAR包列表中是否存在与该类依赖的类对应的字节码文件、以及在被依赖类相关的字节码文件中是否存在被该类访问的元素;若上述任一检查结果为不存在,则视为当前JAR包存在冲突;
所述JAR包检测单元所检查的被依赖类相关的字节码文件包括:所述被依赖类对应的字节码文件、所述被依赖类实现的接口对应的字节码文件、所述被依赖类的超类对应的字节码文件。
14.根据权利要求13所述的用于检测JAR包冲突的装置,其特征在于,所述JAR包检测单元所检查的所述被访问的元素包括:被调用的成员方法、被访问的成员变量。
15.根据权利要求14所述的用于检测JAR包冲突的装置,其特征在于,所述JAR包选择单元包括:
缺省选择子单元,用于根据预先设置的JAR包名称进行选择;或者,
指定选择子单元,用于根据用户当前指定的JAR包名称进行选择;或者,
匹配选择子单元,用于选择其名称与用户指定的关键字相匹配的JAR包,作为所述待进行冲突检测的JAR包。
16.根据权利要求14所述的用于检测JAR包冲突的装置,其特征在于,包括:
类筛选单元,用于针对所述JAR包中的每个类,通过分析该类对应的字节码文件中的常量池,判断该类是否仅依赖本JAR包的类和/或JDK中的类;若是,则将该类标识为“不进行冲突检测”;
相应的,所述JAR包检测单元,具体用于针对未标识为“不进行冲突检测”的类执行分析字节码以及相关的检查操作。
17.根据权利要求14-16任一所述的用于检测JAR包冲突的装置,其特征在于,所述JAR包检测单元包括:
循环控制子单元,用于针对当前待检测JAR包中的每个类,依次触发下述类检查子单元、成员变量检查子单元以及成员方法检查子单元进行检测;
类检查子单元,用于通过分析当前待检测类的字节码文件,对该类自身进行检查;
成员变量检查子单元,用于通过分析当前待检测类的字节码文件,对该类的每个成员变量进行检查;
成员方法检查子单元,用于通过分析当前待检测类的字节码文件,对该类的每个成员方法进行检查。
18.根据权利要求17所述的用于检测JAR包冲突的装置,其特征在于,所述类检查子单元具体用于,针对该类对应的注解类、实现的接口、以及继承的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查该类使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
19.根据权利要求17所述的用于检测JAR包冲突的装置,其特征在于,所述成员变量检查子单元具体用于,针对每个成员变量,针对所述成员变量对应的注解类、以及所述成员变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员变量使用到的所述注解类中的方法是否在所述注解类对应的字节码文件中存在。
20.根据权利要求17所述的用于检测JAR包冲突的装置,其特征在于,所述成员方法检查子单元具体用于,针对每个成员方法,针对所述成员方法对应的注解类、以及所述成员方法参数对应的注解类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员方法使用到的上述注解类中的方法是否分别在所述注解类对应的字节码文件中存在;针对所述成员方法的返回值类型、参数类型以及抛出的异常类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;针对所述成员方法内部字节码指令中的方法调用涉及的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述方法调用使用到的方法签名,是否在所述类相关的字节码文件中存在;针对所述成员方法内部字节码指令涉及的类型、类成员变量对应的类、异常控制try-catch代码块中的异常类型、以及局部变量类型对应的类,检查在预先指定的JAR包列表中是否存在与之对应的字节码文件;检查所述成员方法内字节码指令涉及的类成员变量,是否在所述类相关的字节码文件中存在。
21.根据权利要求17所述的用于检测JAR包冲突的装置,其特征在于,所述JAR包检测单元还包括:
相同JAR包判断子单元,用于判断待查找的类和所述字节码文件对应的类是否在同一个JAR包中,如果是,则不用执行对所述待查找类以及该类中的成员方法和/或成员变量的检查。
22.根据权利要求13所述的用于检测JAR包冲突的装置,其特征在于,还包括:
检测结果输出单元,用于汇总检测到的JAR包冲突,将其以错误日志的形式写入文件中,并将所述文件输出。
23.根据权利要求22所述的用于检测JAR包冲突的装置,其特征在于,所述JAR包检测单元还包括:
唯一性检测子单元,用于检查被依赖类对应的字节码文件在所述预先指定的JAR包列表中是否唯一,若检查结果为否,则视为所述JAR包依赖的该被依赖类存在唯一性冲突;
所述唯一性冲突是指由多个全限定名相同的类所引起的JAR包冲突。
24.根据权利要求23所述的用于检测JAR包冲突的装置,其特征在于,还包括:
警告结果输出单元,用于汇总检测到的所述唯一性冲突,将其以警告日志的形式写入文件中,并将所述文件输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410590017.7A CN105630463B (zh) | 2014-10-28 | 2014-10-28 | 用于检测jar包冲突的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410590017.7A CN105630463B (zh) | 2014-10-28 | 2014-10-28 | 用于检测jar包冲突的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105630463A CN105630463A (zh) | 2016-06-01 |
CN105630463B true CN105630463B (zh) | 2019-07-09 |
Family
ID=56045455
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410590017.7A Active CN105630463B (zh) | 2014-10-28 | 2014-10-28 | 用于检测jar包冲突的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105630463B (zh) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108228229B (zh) * | 2016-12-19 | 2021-04-13 | 深圳业拓讯通信科技有限公司 | 一种Maven依赖的管理方法以及系统 |
CN106874184B (zh) * | 2016-12-21 | 2020-07-14 | 阿里巴巴集团控股有限公司 | 一种Java代码检测方法及装置 |
CN106874060B (zh) * | 2017-01-16 | 2020-12-18 | 吴建伟 | 一种判断jar包是否被引用的方法及设备 |
CN107783757A (zh) * | 2017-10-26 | 2018-03-09 | 福建中金在线信息科技有限公司 | 一种代码规范方法及装置 |
CN107992749B (zh) * | 2017-12-11 | 2021-05-25 | 北京时之砂科技有限公司 | 一种检测补丁包冲突的方法及装置 |
CN110007920B (zh) * | 2018-01-04 | 2022-07-29 | 阿里巴巴集团控股有限公司 | 一种获取代码依赖关系的方法、装置及电子设备 |
CN108595337A (zh) * | 2018-05-07 | 2018-09-28 | 杭州有赞科技有限公司 | 一种Jar包的运行方法及系统 |
CN108628751B (zh) * | 2018-05-17 | 2021-06-11 | 北京三快在线科技有限公司 | 一种无用依赖项检测方法及装置 |
CN111273916B (zh) * | 2018-12-04 | 2024-09-20 | 京东科技控股股份有限公司 | 算法热部署方法、装置、计算机系统和介质 |
CN111309402B (zh) * | 2018-12-11 | 2023-06-27 | 阿里巴巴集团控股有限公司 | 数据监测及针对应用程序的处理方法、装置及设备 |
CN110609788A (zh) * | 2019-08-27 | 2019-12-24 | 绿漫科技有限公司 | 一种检测静态库冲突的自动化方法 |
CN111124931B (zh) * | 2019-12-30 | 2023-10-10 | 中国农业银行股份有限公司 | 一种Java代码合规性检查方法和装置 |
CN111352631B (zh) * | 2020-02-21 | 2024-03-19 | 腾讯音乐娱乐科技(深圳)有限公司 | 一种接口兼容性检测方法及装置 |
CN111651195B (zh) * | 2020-06-17 | 2024-03-12 | 深圳市钱海网络技术有限公司 | 一种系统依赖包冲突检测方法及装置 |
CN113110842A (zh) * | 2020-07-08 | 2021-07-13 | 马森 | 软件字节码同源性分析方法、装置和设备 |
CN112346778B (zh) * | 2020-10-28 | 2022-02-08 | 常州微亿智造科技有限公司 | 一种Java程序编译时自动生成字节码的优化方法 |
CN113448858A (zh) * | 2021-07-09 | 2021-09-28 | 北京三快在线科技有限公司 | 类的冲突检测方法、装置、设备及可读存储介质 |
CN113885874B (zh) * | 2021-09-30 | 2024-10-18 | 平安银行股份有限公司 | Java类文件冲突管理方法、装置、电子设备及介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101719074A (zh) * | 2009-12-17 | 2010-06-02 | 金蝶软件(中国)有限公司 | 补丁实现方法及装置 |
WO2012079335A1 (zh) * | 2010-12-14 | 2012-06-21 | 北京大学 | 基于嵌入式实时java虚拟机的预先类加载方法及装置 |
CN103559132A (zh) * | 2013-11-08 | 2014-02-05 | 北京京东尚科信息技术有限公司 | 一种java应用程序健壮性的检测方法和装置 |
-
2014
- 2014-10-28 CN CN201410590017.7A patent/CN105630463B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101719074A (zh) * | 2009-12-17 | 2010-06-02 | 金蝶软件(中国)有限公司 | 补丁实现方法及装置 |
WO2012079335A1 (zh) * | 2010-12-14 | 2012-06-21 | 北京大学 | 基于嵌入式实时java虚拟机的预先类加载方法及装置 |
CN103559132A (zh) * | 2013-11-08 | 2014-02-05 | 北京京东尚科信息技术有限公司 | 一种java应用程序健壮性的检测方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105630463A (zh) | 2016-06-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105630463B (zh) | 用于检测jar包冲突的方法及装置 | |
WO2021098148A1 (zh) | 一种软件编译方法、装置及电子设备和存储介质 | |
US10372594B2 (en) | Method and device for retrieving test case based on code coverage | |
US9015702B2 (en) | Determining compatibility of an application with different versions of an operating system | |
US9582394B2 (en) | Encapsulating and managing diagnostic information | |
US8914780B2 (en) | Incremental generation of managed assemblies | |
US8381175B2 (en) | Low-level code rewriter verification | |
US20110219359A1 (en) | Identifying test cases to be run after changes to modules of a software application | |
US9959199B2 (en) | Diagnosis of test failures in software programs | |
US10255158B2 (en) | Monitoring and diagnostics of business transaction failures | |
CN108984416B (zh) | 一种评估Maven环境中依赖冲突危险级别的方法 | |
CN105573915A (zh) | 一种基于代码覆盖率的测试方法和装置 | |
CN105678168A (zh) | 一种基于栈异常的shellcode检测方法及装置 | |
CN112099880B (zh) | 场景驱动的应用程序约减方法和系统 | |
CN114328168B (zh) | 异常检测方法、装置、计算机设备和存储介质 | |
CN111352631B (zh) | 一种接口兼容性检测方法及装置 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
US8291389B2 (en) | Automatically detecting non-modifying transforms when profiling source code | |
US9710360B2 (en) | Optimizing error parsing in an integrated development environment | |
EP3692456A1 (en) | Binary image stack cookie protection | |
CN114817047A (zh) | 编译器测试方法、用例生成方法及装置、指令存储结构 | |
US12072983B2 (en) | Language-independent application monitoring through aspect-oriented programming | |
CN117573566B (zh) | 多系统测试用例生成方法、装置及存储介质 | |
US11853151B1 (en) | Task abnormality detection system and embedded device detection method | |
CN113296834B (zh) | 一种基于逆向工程的安卓闭源服务类型信息提取方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |