目录

  • 一:需求
  • 二:jpype介绍
  • 三:jpype的使用
  • 四:类型转换问题
  • 五:容器部署问题
  • 六:JDK版本问题

一:需求

  • 近期接到一个需求, 对方部门给了java的jar包和demo。 要求我们与他们进行HTTP通信需要使用他们的Java写的加解密算法进行加密和签名。 我们的服务全部都是PY写的, 因此如果使用PY对对方提供的jar包进行重写, 风险大, 而且开发周期长。 为了快速的解决这样的问题, 我们采用另外的解决方案----- 使用jpype用py直接调用java的jar包。

二:jpype介绍

  • 用途:python调用java包的工具
  • 安装:pip install JPype1
  • 官方文档:https://jpype.readthedocs.io/en/latest/userguide.html
  • 依赖环境:服务器上必须具备Java环境, 如果是容器化部署, 需要先安装Java。

三:jpype的使用

  • 封装jarloader.py 来启动jvm和加载java的类。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time   : 2023/4/4 11:36
# @Author : shanwen.ren@xiaoying.com
# @Notice : java包加载工具
import jpype
from threading import RLockclass JarLoader:__rlock = RLock()__started = False@classmethoddef start_jvm(cls, classpath, *args):if cls.__started:returnwith cls.__rlock:if not cls.__started:# 加载JVM, 在系统中自动查找jvmPath = jpype.getDefaultJVMPath()base_args = [jvmPath, "-ea", "-Dfile.encoding=utf-8"]base_args += list(args) if args else []# 启动JVMjpype.startJVM(*base_args, convertStrings=False, classpath=classpath)cls.__started = True@staticmethoddef load_class(client_path):# 加载jar包中的类, 返回类, 注意返回的不是对象。 Klass = jpype.JClass(client_path)return Klass@classmethoddef close(cls):jpype.shutdownJVM()  cls.__started = False
  • 使用注意事项

    • class_paths 是所有的jar包列表
    • 例如:
      dir_path = os.path.dirname(__file__)
      client_sdk_path = os.path.join(dir_path, "java_jars/pd-client-sdk-1.2.jar")
      bcprov_path = os.path.join(dir_path, "java_jars/bcprov-jdk15on-1.67.jar")
      bcpkix_path = os.path.join(dir_path, "java_jars/bcpkix-jdk15on-1.67.jar")
      gson_path = os.path.join(dir_path, "java_jars/gson-2.10.1.jar")
      jsch_path = os.path.join(dir_path, "jsch-0.1.55.jar")
      class_paths = [client_sdk_path, bcprov_path, bcpkix_path, gson_path, jsch_path]
      
    • client_path 是jar包中的实现类路径
    • 例如:client_path = “cn.aaa.sdk.service.impl.XXXX类”

四:类型转换问题

  • 由官方文档可只, 某些类型是可以自动转换的, 而有些是不能转换的。
  • 例如:java类需要传递一个Long类型, 但是Py3中没有Long类型了, 如果直接调用, 抛出类型不一致的问题。
  • 解决方案: python的Int类型先转换成Jlon类型, 然后直接塞到Java的类中。
  • 例如: jpype.JLong(file_size)

五:容器部署问题

  • 容器化部署的时候, 需要依赖Java环境。
  • 解决方案: Dockerfile文件中增加一下指令。
  • 先下载jdk包: 我用的是:jdk-8u181-linux-x64.tar.gz
FROM python:3.8.8 AS builder
# 安装JVM,配置JAVA环境变量
ADD jdk-8u181-linux-x64.tar.gz  /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_181 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.ja

六:JDK版本问题

  • 问题描述:在测试环境是否jpype没有任何的异常, 但是在生产环境部署后, 发现jpype调用java的时候, 路径中的密钥读取不进去。
  • 案例:错误提示: Caused by: java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size or default parameters at com.
  • 分析原因:低版本的JDK, 由于美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。密钥长度最大128。 因此如果密钥超过128位, 就会抛出这个异常。
  • 解决方案:
    • 方案一:升级服务器的JDK版本,我从1.8.0_72,升级到1.8.0_181, 解决了该问题。
    • 方案二:下载Oracle官方网站上的无政策限制权限文件, 替换掉自己版本中的这两个文件(local_policy.jar、US_export_policy.jar)
    • 无限制文件链接:https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
    • 下载后将%JAVA_HOME%\jre\lib\security中的local_policy.jar 和US_export_policy.jar替换为下载包中的的local_policy.jar 和US_export_policy.jar。

jpype踩的那些坑相关推荐

  1. mac git使用与配置踩过的坑

    #mac git使用与配置踩过的坑 标题mac配置git ssh密钥 参考链接mac配置git ssh key go get安装失败的解决方法 go get约等于git clone+go instal ...

  2. java项目经理也就那么回事_网易PM | 我们之前在需求评审环节踩过的坑...

    原本觉得需求评审也就那么回事儿,大家应该都差不多这么做的,没啥好说的.不过前不久有一位同学问起来我们是怎么做需求评审的,然后发现有一些团队的做法可能还不大一样,他们也还踩着我们之前踩过的坑,他们还在探 ...

  3. Redis 集群部署及踩过的坑

    本文目标 要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群,同时记录在搭建过程中踩过的坑. 安装准备 centos版本:6.7 redis版本:3.2.3 安装方 ...

  4. AWS Device Farm介绍及Appium踩过的坑

    本文记录了在AWS Device Farm上进行Appium TestNG进行手机应用UI自动化测试的流程及遇到的问题,及具体的解决方法.同时记录了使得测试脚本更稳定的一些代码写法. Device F ...

  5. arcgis python 二次开发_我在部署ArcGIS API for Python时踩到的坑

    ArcGIS API for Python相比于其他ESRI产品,还是很年轻.我在部署时踩到了坑,网上也找不到解决方法,很是煞风景,也很打击学习的积极性. 今天回顾一下,做个总结吧.一方面自己备忘,另 ...

  6. 开发路上踩过的坑要一个个填起来————持续更新······(7月30日)

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  7. git服务器安装位置,Linux服务器安装gitlabe-runner,并部署包到指定目录,还有踩的一些坑~~...

    [TOC] 前言:上篇文章讲解了如何安装一个本地runner,然后用本地runner发布本地包到Linux,但这会有一个问题,在本地runner用scp向Linux发送文件,会造成服务器上的文件越来越 ...

  8. logstash导入数据到Elasticsearch踩过的坑详解

    一.前言 这篇主要记录在导入数据时候踩到的坑,这些坑总共花费我小一天的时间,记录一下. 二.正文 1.logstash显示在导入数据,ES也成功新建了索引,但是没数据 最开始遇到的是这个坑,logst ...

  9. 学python就业要看哪些书-编程0基础自学Python,踩完这些坑,我才成功就业!

    " 0基础小白学Python的路程不易,但总有一些思路和方法值得借鉴,知道这些能让我们少走很多弯路. 今天我们就来分享2位前辈的学习经验和方法. 零基础学编程的方法 回忆一下我自己学习计算机 ...

最新文章

  1. 解决Ubuntu终端编辑时上下左右变成ABCD问题
  2. Win docker 桌面版报错error during connect: This error may indicate that the docker daemon is not running
  3. jMeter 用户自定义变量的存储方式
  4. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...
  5. [js] json和对象有什么区别?
  6. 职称计算机提前考试试卷,职称计算机考试多项选择考试卷模拟考^试题
  7. UITableView使用总结和性能优化
  8. 455 periodic strings
  9. Zuul 上传大文件服务报错的问题
  10. t-SNE数据降维可视化
  11. 怎么制作你的第一个机器人
  12. HTML项目立项,作为承建方,其项目立项的第一步工作是()。A.编制立项申请书B.项目论证C.项目 - 信管网...
  13. python字典统计排序1_数据分析1_入门Python
  14. [系统] Deepin系统常见问题解决(持续更新)
  15. python画波浪线_PPT绘制波浪线的四种方法
  16. 提取文本中的金额,提取货币,Python实现与在线使用
  17. ubuntu18.04中基于Docker搭建tensorflow-gpu开发环境
  18. Java小白的入门面试笔记--线程局部变量之灵魂四问
  19. Task01:熟悉新闻推荐系统的基本流程(代码复现)
  20. JAVA 获取数据库中表的结构

热门文章

  1. mac为什么又叫linux,为什么我从 Mac 换到了 Linux
  2. 7-2 计算Fibonacci数列的前N(N<=20)项 (10 分)
  3. 为什么说入职国企也能越混越好?局外人不懂,内行人明白这4点
  4. 边缘云市场份额,百度智能云领先!
  5. ARM Linux Qt 5.x.x 无标题栏
  6. 【数学模拟卷总结】2022李林四套卷数学二第四套
  7. 通用后台管理系统,管理后台框架模板演示地址
  8. 管理者的人品的重要性
  9. 第四次计算革命孕育“数字经济体”
  10. 鼓励自己最有效的10个方法