• JPype1使用总结


    1. 目的:
      使用Locust+Python压测账号资料接口,使用JPype调用java代码,缩短压测脚本编写

    2. 前提条件:
      进行性能压测过程中,需要压测账号相关接口,由于账号相关接口设计到加密解密,用Python重新编写加解密方式过于繁重,介于后台已开发完账号系统加解密方法,顾产生使用JPype1(用JPype1调用Java类里面的方法)

    3. 环境:
      系统:Centos
      Python版本:2.7.3

    4. 步骤
      • 安装JPype1
        pip install JPype1报如下错误:

        原因解析:缺失gcc相关配置,以及python库
        解决方式:
        Python 2.7
        $ sudo yum -y install gcc gcc-c++ kernel-devel
        $ sudo yum -y install python-devel libxslt-devel libffi-devel openssl-devel
        $ pip install JPype1
        Python 3
        $ sudo apt-get install python3-dev
        $ pip install JPype1
      • 安装java 1.6.0_41
        1. 以前有安装过java,版本且版本不对,先删除已安装的版本:
          使用rpm -qa | grep jdk,可以找到已经安装的jdk:
               java-1.8.0-openjdk-headless-1.8.0.191.b12-0.el7_5.x86_64
               java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
               copy-jdk-configs-3.3-10.el7_5.noarch
          依次删除上面已安装的文件
              命令:yum -y remove + jdk名
              例:yum -y remove java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
        2. 安装java 1.6.0_41使用下面命令可以查找yum库中有哪些版本的jdk
              yum search java | grep jdk
          选择java-1.6.0-openjdk.x86_64进行安装
              yum install java-1.6.0-openjdk.x86_64
          默认的安装目录为:
              /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64
          设置环境变量:
             vim /etc/profile
          在profile文件中添加如下内容  
              #set java environment 
             JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64
             JRE_HOME=$JAVA_HOME/jre
             CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
             PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 
             export JAVA_HOME JRE_HOME CLASS_PATH PATH
           更新修改:
             source /etc/profile 
          命令行输入java会出现提示则说明安装成功
        3. 将需要调用的jar包和依赖jar包放在程序的同一目录
    5. 使用JPype:(此处遇到的问题比较多)
      • 使用jvmPath=jpype.getDefaultJVMPath(),无法获取到JVM.dll文件,改问题在centos中不会出现

        解决方式:
        在安装的Java路径下找到jvm.dll,我本机安装的jvm路径是:C:/Program Files/Java/jdk1.6.0_45/jre/bin/server/jvm.dll
        windows下替换jpype.getDefaultJVMPath()自动获取即:
        jvmPath = "C:/Program Files/Java/jdk1.6.0_45/jre/bin/server/jvm.dll"
      • Python奔溃问题:

        逻辑:
        (1)本次涉及到依据方法1返回的盐等信息,
        (2)再使用JPype调用java的加密方法
        (3)再赋予方法2的请求体值
        原因解析:从上图中框出来的代码可以看出,是在JPype调用shutdownJVM()后,调用打印函数,答应了shoutdownJVM()前的signMandA变量
        解决方式:将逻辑1返回回来的数据,通过逻辑2去调用,再将上面的逻辑3放入到逻辑2内,目的在于避免shoutdownJVM()后原逻辑2返回的数据被释放
      • 找不到jar包中的class

        原因分析如下:
        (1)打包jar包时,java版本不统一,导致数据解析时出现问题
        (2)python与JDK位数不一致,64/32,打包前确认使用哪个位数的
        (3)打包的jar包内类内的函数使用了static方法、private修饰符,导致调用失败
        解决方式:统一打包和使用环境jdk版本和位数,统一python和jdk位数
      • 压测时JVM只正常执行一次里面的内容

        原因分析:上图中打印了JVM is already started,说明在压测的时候重复去打开Jave的JVM虚拟机,导致不执行
        解决方式:打开JVM前,判断JVM状态是否为打开,配上判断JVM状态代码:
        if not jpype.isJVMStarted():
        jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=%s" % jarpath)
  • 相关阅读:
    Alpha项目冲刺_博客链接合集
    项目系统设计
    项目需求分析
    项目选题
    项目展示
    原型设计 + 用户规格说明书
    测试与优化
    结对作业1
    MathExam6317
    js入门基础
  • 原文地址:https://www.cnblogs.com/cmnz/p/10157253.html
Copyright © 2020-2023  润新知