Python调⽤jar包中的⽅法
[本⽂出⾃天外归云的博客园]
需求
最近在后台项⽬代码中⼀段⾃定义的AES加解密的程序在平时的测试⼯作中应⽤频繁。因为写脚本经常会需要使⽤,⽽经过各种尝试,⽐如jpype等,都不尽如⼈意。最后转换思路到了⼀种好⽅法:
1. 将java项⽬打成jar包;
2. 设定jar包的Main-class属性;
3. 在python中通过subprocess执⾏jar包。
修改main函数打jar包
在intellij中打jar包:
1. File--> --> 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];
// 调⽤解密程序并打印解密结果
python转java代码这⾥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)municate()
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.
2.
3.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。