找不到JPype类
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位的版本。搞定!问题解决了!