欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用jpype的踩坑記錄

 更新時間:2023年06月20日 09:57:55   作者:一夜奈何梁山  
Pype是一個能夠讓 python 代碼方便地調用 Java 代碼的工具,這篇文章主要來和大家分享一下Python使用jpype會踩的一些坑,希望對大家有所幫助

一:需求

近期接到一個需求, 對方部門給了java的jar包和demo。 要求我們與他們進行HTTP通信需要使用他們的Java寫的加解密算法進行加密和簽名。 我們的服務全部都是PY寫的, 因此如果使用PY對對方提供的jar包進行重寫, 風險大, 而且開發(fā)周期長。 為了快速的解決這樣的問題, 我們采用另外的解決方案----- 使用jpype用py直接調用java的jar包。

二:jpype介紹

用途:python調用java包的工具

安裝:pip install JPype1

官方文檔:https://jpype.readthedocs.io/en/latest/userguide.html

依賴環(huán)境:服務器上必須具備Java環(huán)境, 如果是容器化部署, 需要先安裝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 RLock


class JarLoader:
    __rlock = RLock()
    __started = False

    @classmethod
    def start_jvm(cls, classpath, *args):
        if cls.__started:
            return
        with cls.__rlock:
            if not cls.__started:
            	# 加載JVM, 在系統(tǒng)中自動查找
                jvmPath = jpype.getDefaultJVMPath()
                base_args = [jvmPath, "-ea", "-Dfile.encoding=utf-8"]
                base_args += list(args) if args else []
                # 啟動JVM
                jpype.startJVM(*base_args, convertStrings=False, classpath=classpath)
                cls.__started = True

    @staticmethod
    def load_class(client_path):
    	# 加載jar包中的類, 返回類, 注意返回的不是對象。 
        Klass = jpype.JClass(client_path)
        return Klass

    @classmethod
    def 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包中的實現(xiàn)類路徑

例如:client_path = “cn.aaa.sdk.service.impl.XXXX類”

四:類型轉換問題

由官方文檔可只, 某些類型是可以自動轉換的, 而有些是不能轉換的。

例如:java類需要傳遞一個Long類型, 但是Py3中沒有Long類型了, 如果直接調用, 拋出類型不一致的問題。

解決方案: python的Int類型先轉換成Jlon類型, 然后直接塞到Java的類中。

例如: jpype.JLong(file_size)

五:容器部署問題

容器化部署的時候, 需要依賴Java環(huán)境。

解決方案: Dockerfile文件中增加一下指令。

先下載jdk包: 我用的是:jdk-8u181-linux-x64.tar.gz

FROM python:3.8.8 AS builder
# 安裝JVM,配置JAVA環(huán)境變量
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版本問題

問題描述:在測試環(huán)境是否jpype沒有任何的異常, 但是在生產環(huán)境部署后, 發(fā)現(xiàn)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。

到此這篇關于Python使用jpype的踩坑記錄的文章就介紹到這了,更多相關Python jpype內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 最新python正則表達式(re模塊)詳解

    最新python正則表達式(re模塊)詳解

    在Python中需要通過正則表達式對字符串進?匹配的時候,可以使??個python自帶的模塊,名字為re,這篇文章主要介紹了python正則表達式(re模塊)詳解,需要的朋友可以參考下
    2023-01-01
  • 基于Python實現(xiàn)Excel轉Markdown表格

    基于Python實現(xiàn)Excel轉Markdown表格

    Markdown(也簡稱md)作為一種輕量級標記語言,因其易寫易讀,效果美觀大方,不僅被眾多網站使用,也是程序員們做筆記、寫文檔的首選。本文將利用Python實現(xiàn)Excel轉Markdown表格,感興趣的可以了解一下
    2022-04-04
  • Python編程實現(xiàn)從字典中提取子集的方法分析

    Python編程實現(xiàn)從字典中提取子集的方法分析

    這篇文章主要介紹了Python編程實現(xiàn)從字典中提取子集的方法,結合實例形式對比分析了Python采用字典推導式與序列轉換實現(xiàn)字典提取子集的相關操作技巧與優(yōu)缺點,需要的朋友可以參考下
    2018-02-02
  • 解決Python字典查找報Keyerror的問題

    解決Python字典查找報Keyerror的問題

    這篇文章主要介紹了解決Python字典查找報Keyerror的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python簡單I/O操作示例

    Python簡單I/O操作示例

    這篇文章主要介紹了Python簡單I/O操作,結合實例形式分析了Python針對文件的I/O讀寫及cPickle模塊相關使用操作技巧,需要的朋友可以參考下
    2019-03-03
  • python輕松辦公將100個Excel中符合條件的數(shù)據(jù)匯總到1個Excel里

    python輕松辦公將100個Excel中符合條件的數(shù)據(jù)匯總到1個Excel里

    這篇文章主要為大家介紹了python輕松辦公將100個Excel中符合條件的數(shù)據(jù)匯總到1個Excel里示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Python使用tkinter模塊實現(xiàn)GUI界面的學生信息管理系統(tǒng)流程分步詳解

    Python使用tkinter模塊實現(xiàn)GUI界面的學生信息管理系統(tǒng)流程分步詳解

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡易學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-01-01
  • Python線性方程組求解運算示例

    Python線性方程組求解運算示例

    這篇文章主要介紹了Python線性方程組求解運算,涉及Python使用scipy.linalg.solve進行方程組求解運算的相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • python如何通過注冊表動態(tài)管理組件

    python如何通過注冊表動態(tài)管理組件

    使用注冊表的主要優(yōu)勢是可以在運行時動態(tài)創(chuàng)建對象,從而實現(xiàn)高度可配置和可擴展的設計,這篇文章主要介紹了python如何通過注冊表動態(tài)管理組件,需要的朋友可以參考下
    2024-05-05
  • 詳解Golang 與python中的字符串反轉

    詳解Golang 與python中的字符串反轉

    這篇文章主要介紹了詳解Golang 與python中的字符串反轉的相關資料,這里提供了實現(xiàn)的實例以便大家學習理解,需要的朋友可以參考下
    2017-07-07

最新評論