jpype踩的那些坑
目录
- 一:需求
- 二: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踩的那些坑相关推荐
- mac git使用与配置踩过的坑
#mac git使用与配置踩过的坑 标题mac配置git ssh密钥 参考链接mac配置git ssh key go get安装失败的解决方法 go get约等于git clone+go instal ...
- java项目经理也就那么回事_网易PM | 我们之前在需求评审环节踩过的坑...
原本觉得需求评审也就那么回事儿,大家应该都差不多这么做的,没啥好说的.不过前不久有一位同学问起来我们是怎么做需求评审的,然后发现有一些团队的做法可能还不大一样,他们也还踩着我们之前踩过的坑,他们还在探 ...
- Redis 集群部署及踩过的坑
本文目标 要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群,同时记录在搭建过程中踩过的坑. 安装准备 centos版本:6.7 redis版本:3.2.3 安装方 ...
- AWS Device Farm介绍及Appium踩过的坑
本文记录了在AWS Device Farm上进行Appium TestNG进行手机应用UI自动化测试的流程及遇到的问题,及具体的解决方法.同时记录了使得测试脚本更稳定的一些代码写法. Device F ...
- arcgis python 二次开发_我在部署ArcGIS API for Python时踩到的坑
ArcGIS API for Python相比于其他ESRI产品,还是很年轻.我在部署时踩到了坑,网上也找不到解决方法,很是煞风景,也很打击学习的积极性. 今天回顾一下,做个总结吧.一方面自己备忘,另 ...
- 开发路上踩过的坑要一个个填起来————持续更新······(7月30日)
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- git服务器安装位置,Linux服务器安装gitlabe-runner,并部署包到指定目录,还有踩的一些坑~~...
[TOC] 前言:上篇文章讲解了如何安装一个本地runner,然后用本地runner发布本地包到Linux,但这会有一个问题,在本地runner用scp向Linux发送文件,会造成服务器上的文件越来越 ...
- logstash导入数据到Elasticsearch踩过的坑详解
一.前言 这篇主要记录在导入数据时候踩到的坑,这些坑总共花费我小一天的时间,记录一下. 二.正文 1.logstash显示在导入数据,ES也成功新建了索引,但是没数据 最开始遇到的是这个坑,logst ...
- 学python就业要看哪些书-编程0基础自学Python,踩完这些坑,我才成功就业!
" 0基础小白学Python的路程不易,但总有一些思路和方法值得借鉴,知道这些能让我们少走很多弯路. 今天我们就来分享2位前辈的学习经验和方法. 零基础学编程的方法 回忆一下我自己学习计算机 ...
最新文章
- 解决Ubuntu终端编辑时上下左右变成ABCD问题
- Win docker 桌面版报错error during connect: This error may indicate that the docker daemon is not running
- jMeter 用户自定义变量的存储方式
- 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...
- [js] json和对象有什么区别?
- 职称计算机提前考试试卷,职称计算机考试多项选择考试卷模拟考^试题
- UITableView使用总结和性能优化
- 455 periodic strings
- Zuul 上传大文件服务报错的问题
- t-SNE数据降维可视化
- 怎么制作你的第一个机器人
- HTML项目立项,作为承建方,其项目立项的第一步工作是()。A.编制立项申请书B.项目论证C.项目 - 信管网...
- python字典统计排序1_数据分析1_入门Python
- [系统] Deepin系统常见问题解决(持续更新)
- python画波浪线_PPT绘制波浪线的四种方法
- 提取文本中的金额,提取货币,Python实现与在线使用
- ubuntu18.04中基于Docker搭建tensorflow-gpu开发环境
- Java小白的入门面试笔记--线程局部变量之灵魂四问
- Task01:熟悉新闻推荐系统的基本流程(代码复现)
- JAVA 获取数据库中表的结构