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正则表达式抓取成语网站
Nov 20 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
Python中拆分字符串的操作方法
Jul 23 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 Python
Python 绘制多因子柱状图
May 11 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
js实现简单进度条效果
2020/03/25 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
往来会计岗位职责
2013/12/19 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
感恩教育活动总结
2014/05/05 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技