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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM