Python调用jar包方法实现过程解析


Posted in Python onAugust 11, 2020

需求

最近在后台项目代码中一段自定义的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的解密程序,从而打印出解密后的字符串了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析中国天气网的天气数据
Mar 21 Python
python实现根据图标提取分类应用程序实例
Sep 28 Python
Python文件与文件夹常见基本操作总结
Sep 19 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
Python2与Python3的区别实例总结
Apr 17 Python
python自定义函数def的应用详解
Jun 03 Python
python 如何设置守护进程
Oct 29 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
如何用python免费看美剧
Aug 11 #Python
Pythonic版二分查找实现过程原理解析
Aug 11 #Python
Python3合并两个有序数组代码实例
Aug 11 #Python
Python基于gevent实现文件字符串查找器
Aug 11 #Python
Python3如何实现Win10桌面自动切换
Aug 11 #Python
Python3如何使用多线程升程序运行速度
Aug 11 #Python
使用Python pip怎么升级pip
Aug 11 #Python
You might like
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
强制设为首页代码
2006/06/19 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
基于python编写的微博应用
2014/10/17 Python
python运行时间的几种方法
2016/06/17 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python调用外部程序的实操步骤
2019/03/04 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
Python识别处理照片中的条形码
2020/11/16 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
优秀辅导员事迹材料
2014/02/16 职场文书
人事部专员岗位职责
2014/03/04 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
Python类方法总结讲解
2021/07/26 Python
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang