標籤:匯入jar包 span 目錄 應用 pop java方法 需要 self col
[本文出自天外歸雲的部落格園]
需求
最近在後台項目代碼中一段自訂的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 subprocessimport chardetimport sysclass 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 resultif __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包
Python調用java方法