Jpype中找不到类错误
我在Stack Overflow上看了很多内容,也搜索了很多信息。我还找到了一篇关于JPype类未找到的问题,虽然那篇文章解决了问题,但对我没有帮助!我也遇到了同样的问题!我在用Mac,Python版本是2.7.6。
我的Python代码和A.java文件都在桌面上。但是我一直收到这个错误:
错误追踪(最近的调用在最前面): 文件 "/Users/jeren/Desktop/aa.py",第13行,内容是 A = jpype.JClass("A") 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/jpype/_jclass.py", 第54行,内容是 JClass 抛出 _RUNTIMEEXCEPTION.PYEXC("类 %s 未找到" % name) java.lang.ExceptionPyRaisable: java.lang.Exception: 类 A 未找到
aa.py 的内容是: import jpype
import os
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=/Users/jeren/Desktop/")
A = jpype.JClass("A")
a = A()
jpype.shutdownJVM()
A.java 的内容是:
class A
{
public A()
{
super();
}
public String sayHi()
{
return("Hello");
}
public static void main(String[] argv)
{
System.out.println ("Hello ");
}
public static int add(int a, int b)
{
return(a+b);
}
}
我的Mac、Java和Python都是64位的!那问题可能出在哪里呢?
2 个回答
下面是关于为jpype指定类路径的一些补充说明。
A. 检查JDK路径
我安装了多个版本的Java JDK,但使用getDefaultJVMPath时没有得到预期的路径。我需要把
jpype.getDefaultJVMPath()
替换成实际用来编译代码的JDK路径,比如说:
D:/jdk11/bin/server/jvm.dll
B. 相对路径
可以使用相对路径。如果我的Python文件在一个名为“pkg”的文件夹里,而我的Java类文件在“bin”文件夹的子文件夹“foo”里:
parentFolder
- pkg/main.py
bin/foo/Foo.class
jpype.startJVM(jvmPath, '-Djava.class.path=../bin')
link = jpype.JClass('foo.Foo')
在这个例子中,Java应用程序的工作目录是pkg文件夹。换句话说,在Foo类的main方法里,你可能需要用“../”来访问parentFolder。
C. -cp选项不起作用
我尝试使用-cp选项来代替-Djava.class.path,这样我觉得更直观。然而,下面的代码并不奏效:
jpype.startJVM(jvmPath, '-cp', classPath)
D. 每个jar文件需要单独包含
我尝试包含一个包含多个jar文件的文件夹。
parentFolder
- foo/main.py
- lib/foo.jar
下面的代码不起作用:
jpype.startJVM(jvmPath, '-Djava.class.path=../lib/*")
link = jpype.JClass('foo.Foo')
每个jar文件需要单独包含,比如:
libOath = '../lib'
libJarPaths = str.join(';', [libPath + '/' + name for name in os.listdir(libPath)])
jpype.startJVM(jvmPath, '-Djava.class.path=../lib/*")
link = jpype.JClass('foo.Foo')
(解决方案来自 JPype (Python): 导入jar文件夹)
一切都没问题,只需要在类A的开头加一个'public':
public class A
{
public A()
{
super();
}
public String sayHi()
{
return("Hello");
}