问答 python 调用 java 项目

学学看看 · October 26, 2023 · Last by 学学看看 replied at October 27, 2023 · 4975 hits

公司有个 java 的 spring 项目,使用 maven 打成 jar 包,使用 python 调用加载的时候提示找不到类,有过调用 spring 项目经验的大佬给看下什么问题?
此时当调用到 CryptUtil = jpype.JClass("com.finance.micro.api.util.CryptUtil") 这个加载类的时候就报错,

import jpype
import os,json

path = r"D:\xx\xx\wjctest\wjctest.jar"
jar_path = os.path.join(os.path.abspath("."), path)

# 获取jvm.dll的文件路径
jvmPath = jpype.getDefaultJVMPath()
print("获取的jvm路径", jvmPath)

# 启动jvm
jpype.startJVM(jvmPath, "-Dfile.encoding=UTF8", "-ea", "-Djava.class.path=%s" % jar_path)
print("看到了")

# 加载java类(参数是java的长类名)
CryptUtil = jpype.JClass("com.*.*.api.util.CryptUtil")
# 库名加*
ChannelLoginDTO = jpype.JClass("com.*.*.dto.ChannelLoginDTO")
privateKey = "这里是私钥";
publicKey = "这里是公钥";

instance = ChannelLoginDTO()
instance.setChannelCode("C20220928180834695958");
instance.setCustomerName("123");
instance.setPhone("18511552233");
instance.setCertNo("612823199203631536");

params = CryptUtil.buildRequest(json.loads(x), privateKey, publicKey)
print("打印的参数",params)

# 关闭jvm
jpype.shutdownJVM()

具体的报错如下:
Traceback (most recent call last):
File "D:/microFinanceProject/qa-test/test.py", line 16, in
CryptUtil = jpype.JClass("com.finance.micro.api.util.CryptUtil")
File "D:\Program Files\Anaconda3\lib\site-packages\jpype_jclass.py", line 99, in new
return _jpype._getClass(jc)
TypeError: Class com.finance.micro.api.util.CryptUtil is not found

后来自己如果单独写一个 java 项目,不使用 spring 和 maven 这种框架,打成的 jar 调用就没问题,spring 项目使用 maven 打包 jar,调用的时候就有问题,哪位老板成功用 python 调用 maven 打的 spring 项目的 jar 包,能否贴个示例或者发下注意事项?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 7 条回复 时间 点赞
Barry250 回复

😹 我也想说

我给楼主修改了,注意类库也要加 *

兄弟你打码打了个寂寞,赶紧删了吧,另外加密解密,实在不行自己写个接口调用也行

你先单独运行下这个 jar 包看看能否启动,如果不能启动。首先你要区分这个类下面有没有 main 方法。

import subprocess
# 最后一个参数可用替换你的classPackage
subprocess.run(['java', '-cp', r"D:\xx\xx\wjctest\wjctest.jar", "com.*.*.api.util.CryptUtil"])

私钥和公钥不打个码么

jvmPath = jpype.getDefaultJVMPath(),这里打印出来是啥?是 jvm.dll 么?

看下是否是 32 位,64 位 python 造成的问题。装个 32 位的 python 试下。

我可以跑,不过我是直接加载了一个 class 文件,没有加载 jar 包,然后我跑的时候我记得当时遇到的坑是 64 位的 python 不行,换了 32 的就可以了,包括依赖库也要 32 位的

Barry250 回复

公钥私钥都是 256 位的字符,删掉了好多

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up