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成功类。
问题
当我将 -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成功类。