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 时间处理datetime实例
Sep 06 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
详解django自定义中间件处理
Nov 21 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
pytorch中图像的数据格式实例
Feb 11 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python 实现集合Set的示例
Dec 21 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
python 中yaml文件用法大全
Jul 04 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笔记之:数据类型与常量的使用分析
2013/05/14 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
将php数组输出html表格的方法
2014/02/24 PHP
CI框架常用方法小结
2016/05/17 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
Python中的迭代器漫谈
2015/02/03 Python
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python语言描述最大连续子序列和
2017/12/05 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
2014年医药代表工作总结
2014/11/22 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
交通事故和解协议书
2015/01/27 职场文书
工作证明书
2015/06/15 职场文书
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL