• 错误: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:主要是项目中和反编译工具中,包的层级显示,容易让人产生误解。(其实是告诉我们建包时不要偷懒,哈哈哈)。

  • 相关阅读:
    2018全球最强物联网公司榜单揭晓
    物联网
    kalman滤波
    自动驾驶
    CAN总线基础
    Linux系统下x86和ARM的区别有哪些?
    算法课笔记系列(七)—— 平摊分析Amortized Analysis
    深入理解Linux内存分配
    linux内核--自旋锁的理解
    DMA(直接存储器存取)
  • 原文地址:https://www.cnblogs.com/pcheng/p/12674967.html
Copyright © 2020-2023  润新知