Python調用jar包中的方法


[本文出自天外歸雲的博客園]

需求

最近在后台項目代碼中一段自定義的AES加解密的程序在平時的測試工作中應用頻繁。因為寫腳本經常會需要使用,而經過各種嘗試,比如jpype等,都不盡如人意。最后轉換思路找到了一種好方法:

1. 將java項目打成jar包;

2. 設定jar包的Main-class屬性;

3. 在python中通過subprocess執行jar包。

修改main函數打jar包

在intellij中打jar包:

1. File--> Project Structure... --> Artifacts --> + --> JAR --> From modules with dependencies --> OK --> 勾選Include in project build --> 記錄上方Output directory路徑 --> OK;

2. Build --> Build Project --> 之后就可以在Output directory路徑看到打的jar包了;

3. 用WinRAR打開jar包,修改其中META-INF文件夾下的MANIFEST.MF文件,增加一行Main-class入口,例如:"Main-class: com.package.name.Classname",注意冒號后面空一格,文件最后空一行。

注意:執行jar包就是執行jar包的Main-class中的main函數。所以如果要在python中調用java方法並傳參的話,要在打jar包前修改Main-class中的main方法,Main-class也就是目標java類。

在Main-class的main函數中可以設置傳參:

String data= args[0];
String key = args[1];
// 調用解密程序並打印解密結果

這里data是密文,key是密鑰。

編寫python腳本

然后對應寫python腳本,這里設定python文件名為aes.py,假定我們用來解密的jar包名為aes.jar:

import subprocess
import chardet
import sys

class AES(object):
    def __init__(self, data, key):
        self.data = data
        self.key = key

    def decrypt(self):        
        command = "java -jar aes.jar"
        arg0 = self.data
        arg1 = self.key
        cmd = [command,arg0,arg1]
        new_cmd = " ".join(cmd)
        stdout,stderr = subprocess.Popen(new_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
        encoding = chardet.detect(stdout)["encoding"]
        result = stdout.decode(encoding)
        return result

if __name__ == '__main__':
    data = sys.argv[1]
    key = sys.argv[2]
    AES = AES(data,key)
    print(AES.decrypt())

這里為了與jar包的兩個傳參相對應也設置python腳本需要傳入兩個參數,第一個是待解密的數據data,第二個是解密鑰匙key。

這里我們創建一個文件夾aes,將aes.py和aes.jar放到該文件夾下,二者同處於aes根目錄下。

然后在當前目錄下啟動cmd,執行python腳本,傳入data和key兩個參數給python腳本:

python aes.py "待解密的字符串" "密鑰"

在python腳本會將這兩個參數再傳遞給jar包並調用jar包Main-class的main函數中調用解密過程並打印解密結果。

這樣就可以在python中調用java的解密程序,從而打印出解密后的字符串了。

 

參考資料

1. IntelliJ IDEA java項目導入jar包,打jar包

2. Java運行jar命令提示沒有主清單屬性

3. 在cmd中使用指令來執行jar包


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM