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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
python简单实现旋转图片的方法
May 30 Python
python字典操作实例详解
Nov 16 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
Python简易版图书管理系统
Aug 12 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
Python 下载Bing壁纸的示例
Sep 29 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 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 多个submit提交表单 处理方法
2009/07/07 PHP
php 短链接算法收集与分析
2011/12/30 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
php7 新增功能实例总结
2020/05/25 PHP
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
js 自定义的联动下拉框
2010/02/07 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
原生js实现轮播图
2017/02/27 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
使用python Django做网页
2013/11/04 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
小学敬老月活动方案
2014/02/11 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
人事科岗位职责范本
2014/03/02 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
学校与家长安全责任书
2014/07/23 职场文书
基层党员对照检查材料
2014/09/24 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
比较几种Redis集群方案
2021/06/21 Redis