Python python 调用 jar 包加载 class 的时候始终抛错,折腾了很久,求帮忙解决

minute · 2019年12月13日 · 最后由 minute 回复于 2019年12月20日 · 2660 次阅读

java 代码特别简单

package test;

public class test {

  public int add(int a, int b) {
    return a+b;
  }

  public static void main(String[] args) {
    System.out.print(1233333);
  }
 }

直接运行这个 jar 包是可以的

然后 python 调用的代码

# 启动JVM
jvmPath = getDefaultJVMPath()

try:
    # 加载jar包
    startJVM(jvmpath=jvmPath, classpath="-Djava.class.path=test.jar", convertStrings=False)

    # 指定main class
    JDClass = JClass("test")

    # 创建类实例对象
    jd = JDClass()

    jd.test()

finally:
    # 关闭JVM
    shutdownJVM()

结果报错

查了一些资料都是这么几行代码,不知道为什么我这边就是报错,我的 jdk 是 1.8 32 位的,有人知道为什么吗

试过 test.test 的也是不行的哈

共收到 8 条回复 时间 点赞

加上包名?

gyyfifafans 回复

你是说 JClass("test.test") 还是 JPackage('test')?我都试过没有用😂

JClass = jpype.JClass('test.test')
instance = JClass()
result = instance.add(1, 2)
print result
YueChen 回复

谢谢回复,不过这个也试过了不行

我很久以前也遇到过。如果你确定代码的调用啥的没有问题的话,请检查下 jar 包。1.打 jar 那几种方式看看是否正确 2.解压 jar 包看看 META-INF 对不对 3.确认打 jar 包的 jdk 版本 和你当前调用这个 jar 包所在机器的 jdk 是否是同一个版本。 我当时排查问题好像是出现在 第 2 个上面

yang957600 回复

直接 java -jar 运行这个 jar 包是可以的,jdk 版本也是一致的,META-INF 里面

Manifest-Version: 1.0
Created-By: 1.8.0_66 (Oracle Corporation)
Main-Class: test.test

应该也是没有问题的;
我还试了另外一个可以在 jmeter 里面用的 jar 包,不过 META-INF 里面没有 jdk 版本号,也不行;

META-INF 这个东西不太懂,里面需要什么一定有的东西吗

1、打印下 jvmPath,看看是否获取到了?
2、jar 包的路径是否正确
3、jpype.startJVM(jvmPath, "-Djava.class.path=xxx.jar") 

北向。 回复

1.jvmPath 没有问题;
2.路径我换成了绝对路径;
3.用这种方式加绝对路径就成功了!
太感谢啦!,不过为什么使用 startJVM(jvmpath=jvmPath, classpath="-Djava.class.path=test.jar", convertStrings=False),参数带 key 的方式就会失败呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册