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中的二进制位运算符
May 13 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python实现京东秒杀功能
Jul 30 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
python语言是免费还是收费的?
Jun 15 Python
python中pop()函数的语法与实例
Dec 01 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 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/07/12 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
python selenium firefox使用详解
2019/02/26 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
Windows和Linux动态库应用异同
2016/04/17 面试题
卫校护理专业毕业生求职信
2013/11/26 职场文书
国际会议邀请函范文
2014/01/16 职场文书
秋季运动会广播稿
2014/02/22 职场文书
服务承诺口号
2014/05/22 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
档案管理员岗位职责
2015/02/12 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA
VUE递归树形实现多级列表
2022/07/15 Vue.js