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

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

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

遇到的问题如下:

  1. 兼容问题 。我们内部的Jar包里面的要使用的class,它里面的一个功能要通过JNI调用so库来实现。当我使用Jpype时候发现死活打不开这个so库,报错如下图: 最初我一直以为是我引用的Jar包路径错了,后来一拍大腿才想到,这明明是打开SO库文件失败了。终端输出也说了,not a mach-o file。 然后我进行一顿google,才发现是由于mac系统不支持so库,导致的。 要想使用这个so库,需要作者来编译一个mac上支持的格式 如:.dylib 。这个jar包很老了,找人重新编译明显不够现实。 所以通过jpype直接在M1上调用依赖so库的Jar这种方法失败了。
  2. 缺少主程序入口 然后我开始采用 ‘java -jar xxx’ 这种命令来直接调用java方法。 依然报错,提示的是缺少入口类。也就是说在打包成Jar的时候,作者在配置文件里并没有指定Jar的主程序类是哪个。 要想解决这个问题,就需要重新打Jar来指定入口。 这种方式也行不通。
  3. 操作系统兼容 于是我就想,如果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 以下是具体方法

  4. 执行命令 docker pull centos:7.9.2009 --platform=amd64 然后启动容器,交互式进入容器之后,输入 uname -a 发现输出是 AMD64 ,证明这一步成功了
  5. 在centos容器里,进行一顿猛如虎的操作,安装JAVA 和Python环境 以及安装Jpype。
  6. 安装完Jpype我把Jpype要调用Jar包的代码 以及 要使用的 Jar包全部传入到容器里面。通过调用的方式,发现调用成功了,可以输出我要使用的类的信息。
  7. 供宿主机调用。在宿主机上,我要通过接口方式调用容器里的 这个python代码,那么我考虑将这段代码以及对应的方法暴露成一个服务,于是在容器里安装的fastapi,并且将调用方法写成一个接口供宿主机使用。 (在这里因为我在启动容器时候没有暴露端口,于是我将我现在的容器重新打成一个镜像,然后再重新启动容器 启动时候指定暴露的端口为8080。即fastapi的端口。)
  8. 因为宿主机会频繁调用容器里的这个接口,但是在调用java的时候 又需要创建和销毁虚拟机。导致有时候会出问题。最终我将开启和关闭虚拟机的代码写到fastapi的全局启动和销毁事件里。代码如下

    @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()
    
    
        
  9. 最终宿主机调用容器里的这个Python接口,成功调用,问题解决。

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

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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇