問題:
使用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:主要是項目中和反編譯工具中,包的層級顯示,容易讓人產生誤解。(其實是告訴我們建包時不要偷懶,哈哈哈)。