找不到JPype类

2 投票
3 回答
8614 浏览
提问于 2025-04-18 05:08

JPype是一个很棒的项目,它可以让我们直接从Python中创建一个JVM(Java虚拟机)。

不过,我在最开始的步骤中遇到了麻烦。

我有一个A.java的源代码,放在C:\tmp文件夹

class A {
    public A() {
        super();
    }
    public String sayHi() {
        return("Hello");
    }
}

我用命令javac A.java把它编译成了一个类,所以A.class现在在C:\tmp文件夹里。

我还有以下的Python源代码:

import os
import jpype
jpype.startJVM(jpype.getDefaultJVMPath(), '-ea', '-Djava.class.path=c:\\tmp')
A = jpype.JClass("A")
a = A()
print a.sayHi()
jpype.shutdownJVM()

当我运行这段代码时,出现了下面的错误:

C:\tmp>jpype_test.py
Traceback (most recent call last):
  File "C:\tmp\jpype_test.py", line 10, in <module>
    A = jpype.JClass("A")
  File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
    raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class A not found

因为找不到A类,这可能是和CLASSPATH(类路径)有关的问题,但我不知道自己哪里做错了。

有没有什么提示呢?

编辑 1:

问题依然存在。不过,补充一下,如果我使用一些原生的Java库,比如:java.util,代码就能正常运行,没有错误。例如,下面的代码可以正常工作:

import jpype
jpype.startJVM(jpype.getDefaultJVMPath())
util = jpype.JPackage("java.util")
al = util.ArrayList()
al.add(1)
al.add(2)
print al.size()
jpype.shutdownJVM()

并且返回2。

编辑 2:

问题解决了,见下面的回答...

3 个回答

-1

试着用一个 \ 来表示路径,而不是两个 \,并且在Windows系统中,根目录的盘符要用大写的 C,像这样:

jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=C:\tmp\A.jar")

在我的情况下,这样做是有效的。

重要提示:

  • 我安装了64位的JDK 11和Python 3.9.6。

  • 你可以创建一个jar文件,把类A打包进去。

  • 你可以通过在命令行中执行以下命令来检查你安装的Python是32位还是64位:

python -c "import sys; print(sys.maxsize > 2**32)"
-1

试着把你的路径改成这样:

    jpype.startJVM(jpype.getDefaultJVMPath(), '-ea', '-Djava.class.path=c:\\tmp\')
6

我解决了这个问题,留个记录在这里。

1) 源代码没有任何问题。

2) 问题出在我的 Python 是32位的,而我的 java sdk(包括javac字节码编译器)是64位的。我卸载了 java sdk,然后重新安装了一个32位的版本。搞定!问题解决了!

撰写回答