前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于在Mac操作系统下,M1上Python调用Jar包的折腾记录

关于在Mac操作系统下,M1上Python调用Jar包的折腾记录

作者头像
huolong
发布2024-04-22 10:17:54
1310
发布2024-04-22 10:17:54
举报
文章被收录于专栏:技术指北技术指北

最近我有一个工具需求就是在我的电脑上通过Python来调用我们内部的一个Jar包,没想到这么一个简简单单的需求,折腾了将近2天的时间,在这里做一个总结,来简单说一下这过程中遇到的问题,希望可以帮助到后来人

在Python上调用Java的Jar包,我知道的有2个方法。1个是通过Jpype,2是通过通过subprocess在终端调用'java -jar XX'命令。因为我打算长期用这个工具,所以在最初我采用了第一种方法。

遇到的问题如下:

兼容问题 。我们内部的Jar包里面的要使用的class,它里面的一个功能要通过JNI调用so库来实现。当我使用Jpype时候发现死活打不开这个so库,报错如下图:

最初我一直以为是我引用的Jar包路径错了,后来一拍大腿才想到,这明明是打开SO库文件失败了。终端输出也说了,not a mach-o file。 然后我进行一顿google,才发现是由于mac系统不支持so库,导致的。 要想使用这个so库,需要作者来编译一个mac上支持的格式 如:.dylib 。这个jar包很老了,找人重新编译明显不够现实。 所以通过jpype直接在M1上调用依赖so库的Jar这种方法失败了。

缺少主程序入口 然后我开始采用 'java -jar xxx' 这种命令来直接调用java方法。 依然报错,提示的是缺少入口类。也就是说在打包成Jar的时候,作者在配置文件里并没有指定Jar的主程序类是哪个。 要想解决这个问题,就需要重新打Jar来指定入口。 这种方式也行不通。

操作系统兼容 于是我就想,如果Mac不支持so,那我用Linux虚拟机上面进行调用Jar总行了把。于是乎进行一顿操作,安装好了vmware,centos虚拟机,java 和python环境,全部正好。一调用就发现了新的问题。报错如下: no such file or directory (possible cause: can't load AMD 64-bit .so on aarch64-bit platform) 当我看到这个的时候我就想到了又是操作系统兼容问题,so库是在AMD64平台打的。但是M1 是ARM架构,在这上面的虚拟机默认是AARCH64的。依然不兼容

我只能采用最终方式,通过docker来启动一个centos的镜像,但是要注意指定系统架构为AMD64 以下是具体方法

执行命令 docker pull centos:7.9.2009 --platform=arm64 然后启动容器,交互式进入容器之后,输入 uname -a 发现输出是 AMD64 ,证明这一步成功了

在centos容器里,进行一顿猛如虎的操作,安装JAVA 和Python环境 以及安装Jpype。

安装完Jpype我把Jpype要调用Jar包的代码 以及 要使用的 Jar包全部传入到容器里面。通过调用的方式,发现调用成功了,可以输出我要使用的类的信息。

供宿主机调用。在宿主机上,我要通过接口方式调用容器里的 这个python代码,那么我考虑将这段代码以及对应的方法暴露成一个服务,于是在容器里安装的fastapi,并且将调用方法写成一个接口供宿主机使用。 (在这里因为我在启动容器时候没有暴露端口,于是我将我现在的容器重新打成一个镜像,然后再重新启动容器 启动时候指定暴露的端口为8080。即fastapi的端口。)

因为宿主机会频繁调用容器里的这个接口,但是在调用java的时候 又需要创建和销毁虚拟机。导致有时候会出问题。最终我将开启和关闭虚拟机的代码写到fastapi的全局启动和销毁事件里。代码如下

代码语言:javascript
复制
@app.on_event("startup")
def startup():
# 加载JVM
jpype.startJVM(
    jpype.getDefaultJVMPath(),
    '-Djava.class.path=XXX-1.2.jar')
@app.on_event("shutdown")
def shutdown():
jpype.shutdownJVM()

最终宿主机调用容器里的这个Python接口,成功调用,问题解决。

创作不易,如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。

我准备了一个导航网站,上面记录了一些常用的网站集合,也包含一些羊毛,应该可以帮到你,感兴趣可以访问:https://u1s1.one/ ,欢迎收藏使用

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024年04月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com