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算法学习之计数排序实例
Dec 18 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
Python退火算法在高次方程的应用
Jul 26 Python
对python中Json与object转化的方法详解
Dec 31 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
python实现马丁策略的实例详解
Jan 15 Python
Python3 如何开启自带http服务
May 18 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
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
快速解决element的autofocus失效问题
2020/09/08 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Django进阶之CSRF的解决
2018/08/01 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Python类的动态绑定实现原理
2020/03/21 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
行政人员岗位职责
2013/12/08 职场文书
财务方面个人工作的自我评价
2013/12/28 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
2016小学新学期寄语
2015/12/04 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis