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

  • 相关阅读:
    08-Django模板(2)
    07-Django模板(1)
    06-Django视图
    05-Django模型(2)
    04-Django模型(1)
    03-Django基础概念和MVT架构
    16-增量式爬虫
    15-scrapy-redis两种形式分布式爬虫
    14-scrapy框架(CrawlSpider)
    Linux启动/停止/重启Mysql数据库的方法
  • 原文地址:https://www.cnblogs.com/pcheng/p/12674967.html
Copyright © 2011-2022 走看看