最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用jpype的踩坑記錄

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

一:需求

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

二:jpype介紹

用途:python調(diào)用java包的工具

安裝:pip install JPype1

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

依賴環(huán)境:服務(wù)器上必須具備Java環(huán)境, 如果是容器化部署, 需要先安裝Java。

三:jpype的使用

封裝jarloader.py 來(lái)啟動(dòng)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)中自動(dòng)查找
                jvmPath = jpype.getDefaultJVMPath()
                base_args = [jvmPath, "-ea", "-Dfile.encoding=utf-8"]
                base_args += list(args) if args else []
                # 啟動(dòng)JVM
                jpype.startJVM(*base_args, convertStrings=False, classpath=classpath)
                cls.__started = True

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

    @classmethod
    def close(cls):
        jpype.shutdownJVM()  
        cls.__started = False

使用注意事項(xiàng)

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

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

四:類型轉(zhuǎn)換問題

由官方文檔可只, 某些類型是可以自動(dòng)轉(zhuǎn)換的, 而有些是不能轉(zhuǎn)換的。

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

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

例如: jpype.JLong(file_size)

五:容器部署問題

容器化部署的時(shí)候, 需要依賴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版本問題

問題描述:在測(cè)試環(huán)境是否jpype沒有任何的異常, 但是在生產(chǎn)環(huán)境部署后, 發(fā)現(xiàn)jpype調(diào)用java的時(shí)候, 路徑中的密鑰讀取不進(jìn)去。

案例:錯(cuò)誤提示: Caused by: java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size or default parameters at com.

分析原因:

低版本的JDK, 由于美國(guó)的出口限制,Sun通過權(quán)限文件(local_policy.jar、US_export_policy.jar)做了相應(yīng)限制。密鑰長(zhǎng)度最大128。 因此如果密鑰超過128位, 就會(huì)拋出這個(gè)異常。

解決方案:

方案一:升級(jí)服務(wù)器的JDK版本,我從1.8.0_72,升級(jí)到1.8.0_181, 解決了該問題。

方案二:下載Oracle官方網(wǎng)站上的無(wú)政策限制權(quán)限文件, 替換掉自己版本中的這兩個(gè)文件(local_policy.jar、US_export_policy.jar)

無(wú)限制文件鏈接: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。

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

相關(guān)文章

  • python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn)

    python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn)

    這篇文章主要介紹了python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python使用elasticsearch的過程詳解

    python使用elasticsearch的過程詳解

    Elasticsearch 是一個(gè)開源的搜索引擎,建立在一個(gè)全文搜索引擎庫(kù) Apache Lucene基礎(chǔ)之上,這篇文章主要介紹了python使用elasticsearch的詳細(xì)過程,需要的朋友可以參考下
    2024-03-03
  • Python基于高斯消元法計(jì)算線性方程組示例

    Python基于高斯消元法計(jì)算線性方程組示例

    這篇文章主要介紹了Python基于高斯消元法計(jì)算線性方程組,結(jié)合實(shí)例形式分析了Python高斯消元法針對(duì)方程組求解的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Jupyter Notebook切換虛擬環(huán)境的三種方法

    Jupyter Notebook切換虛擬環(huán)境的三種方法

    本文主要介紹了Jupyter Notebook切換虛擬環(huán)境的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python蒙特卡洛算法實(shí)現(xiàn)排列組合

    Python蒙特卡洛算法實(shí)現(xiàn)排列組合

    排列組合是數(shù)學(xué)中的基本概念,也是編程中常見的問題之一,本文主要介紹了Python蒙特卡洛算法實(shí)現(xiàn)排列組合,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Python數(shù)據(jù)處理Filter函數(shù)高級(jí)用法示例

    Python數(shù)據(jù)處理Filter函數(shù)高級(jí)用法示例

    本文將詳細(xì)介紹filter函數(shù)的使用方法,并提供豐富的示例代碼,幫助你深入理解如何利用它來(lái)處理數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • python實(shí)現(xiàn)簡(jiǎn)單的單變量線性回歸方法

    python實(shí)現(xiàn)簡(jiǎn)單的單變量線性回歸方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)簡(jiǎn)單的單變量線性回歸方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-11-11
  • Python利用pandas進(jìn)行數(shù)據(jù)合并詳解

    Python利用pandas進(jìn)行數(shù)據(jù)合并詳解

    當(dāng)使用Python中的pandas庫(kù)時(shí),merge函數(shù)是用于合并(或連接)兩個(gè)數(shù)據(jù)框(DataFrame)的重要工具。它類似于SQL中的JOIN操作,下面我們就來(lái)看看它的具體操作吧
    2023-11-11
  • python 實(shí)現(xiàn) hive中類似 lateral view explode的功能示例

    python 實(shí)現(xiàn) hive中類似 lateral view explode的功能示例

    這篇文章主要介紹了python 實(shí)現(xiàn) hive中類似 lateral view explode的功能示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-05-05
  • Python分割指定頁(yè)數(shù)的pdf文件方法

    Python分割指定頁(yè)數(shù)的pdf文件方法

    今天小編就為大家分享一篇Python分割指定頁(yè)數(shù)的pdf文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-10-10

最新評(píng)論

南岸区| 长葛市| 泸州市| 河津市| 洛阳市| 林甸县| 高邑县| 武隆县| 龙口市| 六安市| 长泰县| 栾川县| 昌都县| 富宁县| 丹巴县| 孝义市| 会理县| 临漳县| 南安市| 鸡西市| 西华县| 洛扎县| 当涂县| 铜川市| 安义县| 望谟县| 贵阳市| 垫江县| 包头市| 明星| 唐山市| 左权县| 靖江市| 新郑市| 井研县| 兴业县| 海盐县| 峨边| 开远市| 宝丰县| 青阳县|