Jpype:在 jar 中导入 类 时出现 ModuleNotFoundError

Jpype: ModuleNotFoundError when import classes in jar

问题

当我将 -Djava.class.path 设置为目录 "jars/*" 时,我得到了一个 ModuleNotFoundError: No module named 'spoon'

项目结构

utils
├── __init__.py
├── jars
│   └── spoon-core-9.2.0-beta-4.jar
└── parse_utils.py
# parse_utils.py

import jpype
import jpype.imports
from jpype.types import *

JARS_PATH = 'jars/*'
jpype.startJVM(jpype.getDefaultJVMPath(),  '-Djava.class.path=' + JARS_PATH)

import spoon.Launcher as Launcher

我试过的

JClass 和 JPackage

我在 Whosebug 上发现了类似的问题,我尝试了最上面的答案但失败了。

Launcher = jpype.JPackage('spoon').Launcher  # AttributeError: Java package 'spoon' is not valid
Launcher = jpype.JClass('spoon.Launcher')  # TypeError: Class spoon.Launcher is not found
Launcher = jpype.JClass("java.lang.Class").forName('spoon.Launcher') # java.lang.ClassNotFoundException: java.lang.ClassNotFoundException: spoon.Launcher

使用 jar 路径

JARS_PATH = 'jars/spoon-core-9.2.0-beta-4.jar'

我得到了:

Traceback (most recent call last):
  File "ClassLoader.java", line 357, in java.lang.ClassLoader.loadClass
  File "Launcher.java", line 338, in sun.misc.Launcher$AppClassLoader.loadClass
  File "ClassLoader.java", line 424, in java.lang.ClassLoader.loadClass
  File "URLClassLoader.java", line 381, in java.net.URLClassLoader.findClass
java.lang.ClassNotFoundException: java.lang.ClassNotFoundException: com.martiansoftware.jsap.JSAPException

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "org.jpype.pkg.JPypePackage.java", line -1, in org.jpype.pkg.JPypePackage.getObject
  File "Class.java", line 348, in java.lang.Class.forName
  File "Class.java", line -2, in java.lang.Class.forName0
Exception: Java Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/audrey/Documents/GitHub/xiaoven/codegex/utils/parse_utils.py", line 16, in <module>
    import spoon.Launcher as Launcher
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 914, in _find_spec
  File "/usr/local/Caskroom/miniconda/base/envs/codegex/lib/python3.8/site-packages/jpype/imports.py", line 194, in find_spec
    if not hasattr(base, parts[2]):
java.lang.NoClassDefFoundError: java.lang.NoClassDefFoundError: com/martiansoftware/jsap/JSAPException

参见this link

I would start with checking to see if the jar was picked up in the path.

import jpype
jpype.startJVM(classpath="jars/*")
print(jpype.java.lang.System.getProperty("java.class.path"))

My guess is there is a syntax error in your test code, or the spoon jar is missing some dependency, but nothing stands out in your example. Do you have the required jar dependencies including com.martiansoftware.jsap.JSAPException in the jars directory?

我根据错误日志(或IDEA项目视图下的External Libraries列表)手动下载缺失的jar后,导入spoon成功类。