错误:Attempt to resolve method: [XXX] on undefined variable or class name: [XXX]的解决(IDEA打包jar问题)
问题:
使用JMeter调用jar包的时候,报错误信息Typed variable declaration : Attempt to resolve method:[XXX] on undefined variable or class name: [XXX]。意思是XXX类中没有找到定义的XXX方法。
这看着是一个JMeter的使用jar问题,但事实上是IDEA的jar打包问题!
解决思路:
通常的解决方法:
1、确认是否引入jar包。在测试计划 → Add directory or jar to classpath 中引入jar包。
2、确认是否引入对应的类。在BeanShell PreProcessor → Script 的开头写对应的import,如import com.demo.XXX;。
3、确认引用的类名、方法名是否正确。
仔细看了一遍引用的包、类名、方法名,都没问题。开始怀疑是打包的jar有问题,我是用IDEA打的包叫Des,为了区分,之前用MyEclipse比较多,于是用MyEclipse重新打了个包叫DesUtil,神奇的事情发生了,JMeter引用后发现没有问题!!!
于是,本着技术宅的执着,开始对比两个jar包,研究了好久,才发现其中的两个奥秘(两个深坑)!首先用反编译工具打开jar包,其实之前我调不通的时候我也打开jar包看过,发现目录结构并没有问题,这样看确实是一模一样的,如图:
IDEA打包的
====================我是分割线====================
MyEclipse打包的
这里其实有第一个坑,很平常的目录结构,看着是一样。而事实上,这两个包的目录结构是不一样的。我们解压两个jar看他的目录。
IDEA打包的
====================我是分割线====================
MyEclipse打包的
发现没有,两个目录层级其实是不一样的,IDEA打包的文件夹叫“com.demo”,明显是有问题的,并没有层级关系。然而这个差异,在反编译工具里是看不出来的,可以对比前面反编译工具里的2张图。
那么新的问题来了,为啥IDEA打包的文件夹会变成“com.demo”呢?仔细研究发现,是导出jar的配置有问题,MyEclipse导出jar包时,路径是不需要我们创建的,而IDEA的jar包路径是要我们手动创建的。这时候第二个坑就来了!首先IDEA中,如果要建两层包的结构是可以直接用“com.demo”这样的方式命名包的,会出现两层结构,如图:
创建包:
文件夹显示:
项目工程中显示:
可以看到,当文件夹没有其他文件时,项目工程里就是这么显示的。但是!导出jar的时候是不能以这种方式命名包的,即使包下面没有其他文件了。如果用这样的方式,就会出现刚的问题,文件夹名称变成了“com.demo”。两种命名方式,包的层级结构是不一样的,如下图两个红框所示:
解决方法:
所以正确的方式是,按如下建立目录结构,然后导出jar包。问题解决!
PS:主要是项目中和反编译工具中,包的层级显示,容易让人产生误解。(其实是告诉我们建包时不要偷懒,哈哈哈)。
本文来自博客园,作者:PC君,转载请注明原文链接:https://www.cnblogs.com/pcheng/p/12674967.html