Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpype导入在jar中找不到模块_Java_Python_Import_Executable Jar_Jpype - Fatal编程技术网

Java Jpype导入在jar中找不到模块

Java Jpype导入在jar中找不到模块,java,python,import,executable-jar,jpype,Java,Python,Import,Executable Jar,Jpype,我在工作中接受了一项任务,即找到一种方法,从Python项目中现有的jar文件中使用一些方法。我在Python方面的经验非常有限,但我以前使用过这个特定的jar文件(它是我们正在进行的项目的一部分)。我不允许修改这两个项目的大部分内容,它们需要尽可能独立 我研究了在Python中包含jar方法的多种方法。到目前为止,我已经尝试了Jython(我不能使用Jython,因为Python项目在其他库中使用PyQt,如果我的理解正确的话,这会强制使用CPython)、Pyjnius和JPype。JPyp

我在工作中接受了一项任务,即找到一种方法,从Python项目中现有的jar文件中使用一些方法。我在Python方面的经验非常有限,但我以前使用过这个特定的jar文件(它是我们正在进行的项目的一部分)。我不允许修改这两个项目的大部分内容,它们需要尽可能独立

我研究了在Python中包含jar方法的多种方法。到目前为止,我已经尝试了Jython(我不能使用Jython,因为Python项目在其他库中使用PyQt,如果我的理解正确的话,这会强制使用CPython)、Pyjnius和JPype。JPype似乎是最有前途的,但我也无法让它工作。我已经把我的代码贴在下面,有点删剪,因为我不知道我可以分享多少

from jpype import *
import jpype.imports

try:
    jpype.addClassPath("jars/sdk.jar") #the relative path to the jar file
    jpype.startJVM(convertStrings=False)
    java.lang.System.out.println(jpype.getClassPath()) #printing the classpath to check, the path is correctly pointing to the sdk.jar file

    java.lang.System.out.println("Hello world") #just to check if jpype is installed correctly, works

    jpype.imports.registerDomain("a")
    from a.b.c.d.e.f.g.h import SomeClass #fails here

except OSError as err:
    print(err)  # ToDo: Remove print when done
    pass
我得到的错误是找不到模块a.b.c.d.e.f.g.h.SomeClass。我尝试了不同的方法来给出路径(绝对路径、相对路径、将jar放在项目中的不同位置以及项目外部),但这似乎不是问题,因为打印的路径是jar文件的正确绝对路径

此外,jar还用于其他(Java)项目中,并且可以正常工作。它是使用maven包创建的(如果相关,则使用IntelliJ,并且与JPype JVM使用的Java版本相同)。在Java项目中,导入将是:

import a.b.c.d.e.f.g.h.SomeClass;
我复制了它,并将语法转换为Python

我还尝试用JObject创建类(我可能无论如何都做得不对),并用JPackage尝试了较旧的语法(据我所知)。对于JPackage方式,我得到一个异常,即包a.b.c.d.e.f.g.h.SomeClass.someMethod是不可调用的,据我所知,这与我使用jpype导入得到的异常是等效的。我已经讨论了我在这里可以找到的所有类似问题,但这些解决方案都没有帮助我


有人能提出一些可能的解决办法吗?或者有人能看出我做错了什么吗?还欢迎关于替代JPype的其他可能性的建议。如果有任何需要澄清的地方,我会编辑这个问题。

如果jar在类路径上并且导入失败,唯一可能的事情就是缺少一些依赖项。您还有两种方法可以尝试加载该类,这可能会提供额外的诊断

jpype.JClass("a.b.c.d.e.f.g.h.SomeClass")

第一种是通过完整的类规范手动加载类。这是在进口协议下发生的事情。第二个是调用Java来加载类(绕过所有JPype)。它返回一个java.lang.Class,该类可以传递给JClass以生成包装器

常见故障包括缺少jar或本机库、试图从模块内启动JPype、相对路径错误、由于缺少资源而导致的类初始化错误。JPype只是调用JNI调用,所以如果Java端一切正常,它应该可以工作。假设您检查了java.class.path系统变量,那么它一定与类资源有关


如果您想尝试查找另一个包,那么JPype用户手册中有一个可选部分。除了PyJnius之外,大多数替代方案似乎都没有维护。

您是否尝试过使用
jpype.JPackage
进行导入?是的,它仍然不起作用。我想我在上面提到过,这是因为当我尝试访问一个方法时,包是不可调用的;只是出于好奇,你试过使用罐子的绝对路径吗?是的,这是我最初的想法之一。但它仍然不起作用,然后我开始打印类路径,并且路径是正确的(即使我将其作为相对路径提供)。我使用Jpype 1.0.1重新创建了相同的步骤,它对我有效,但是它不起作用的唯一情况是我提供了错误的路径,您使用的是什么版本的jpype和python?jar文件确实存在一些问题,在修复它们并重试所有操作之后,您的第二个建议奏效了。JPype和Python项目使用的其他一些库之间似乎存在某种冲突,但到目前为止,它似乎工作正常。谢谢你的回答!
jpype.JClass("java.lang.Class").forName("a.b.c.d.e.f.g.h.SomeClass")