sun.misc.InvalidJarIndexException:从 com.* 包导入时索引无效
sun.misc.InvalidJarIndexException: Invalid index when importing from com.* package in Jython standalone
当我尝试在我的应用程序中使用 Jython 独立 JAR 时遇到 InvalidJarIndexException,我无法弄清楚我做错了什么。
一旦我尝试从以 "com." 开头的包中为任何 Java class 执行带有导入语句的 Python 脚本,例如:"com.foo.Bar",抛出如下异常(t运行cated):
Traceback (most recent call last):
File "<string>", line 1, in <module>
sun.misc.InvalidJarIndexException: Invalid index
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1152)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1062)
at sun.misc.URLClassPath$JarLoader.findResource(URLClassPath.java:1032)
at sun.misc.URLClassPath.findResource(URLClassPath.java:225)
at java.net.URLClassLoader.run(URLClassLoader.java:572)
at java.net.URLClassLoader.run(URLClassLoader.java:570)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:569)
at java.lang.ClassLoader.getResource(ClassLoader.java:1089)
at java.net.URLClassLoader.getResourceAsStream(URLClassLoader.java:233)
at org.python.core.ClasspathPyImporter.tryClassLoader(ClasspathPyImporter.java:221)
at org.python.core.ClasspathPyImporter.makeEntry(ClasspathPyImporter.java:208)
at org.python.core.ClasspathPyImporter.makeEntry(ClasspathPyImporter.java:18)
at org.python.core.util.importer.getModuleInfo(importer.java:174)
at org.python.core.util.importer.importer_find_module(importer.java:98)
at org.python.core.ClasspathPyImporter.ClasspathPyImporter_find_module(ClasspathPyImporter.java:134)
at org.python.core.ClasspathPyImporter$ClasspathPyImporter_find_module_exposer.__call__(Unknown Source)
at org.python.core.PyBuiltinMethodNarrow.__call__(PyBuiltinMethodNarrow.java:48)
at org.python.core.imp.find_module(imp.java:761)
at org.python.core.imp.import_next(imp.java:1158)
at org.python.core.imp.import_module_level(imp.java:1350)
at org.python.core.imp.importName(imp.java:1528)
at org.python.core.ImportFunction.__call__(__builtin__.java:1285)
at org.python.core.PyObject.__call__(PyObject.java:433)
at org.python.core.__builtin__.__import__(__builtin__.java:1232)
at org.python.core.imp.importOneAs(imp.java:1564)
at org.python.pycode._pyx0.f[=11=](<string>:1)
at org.python.pycode._pyx0.call_function(<string>)
at org.python.core.PyTableCode.call(PyTableCode.java:173)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1687)
at org.python.core.Py.exec(Py.java:1731)
at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:268)
at com.so.Script.execute(Script.java:20)
这是我在我的代码中所做的一切(我实际上是通过调用 new Script().execute()
的 JMenuItem 上的 Swing 动作来调用它的,这很可能是不相关的):
package com.so;
import org.python.core.PyDictionary;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
public class Script {
public Script() {
}
public void execute() {
PyDictionary table = new PyDictionary();
PySystemState state = new PySystemState();
PythonInterpreter interp = new PythonInterpreter(table, state);
String script;
script = "" +
"import com.foo.Bar as Bar\n" +
"";
interp.exec(script);
}
}
即使在我的class路径中没有这样的package/class也没关系。但最让我困惑的是,当我认为这必须与 classpath 相关时,创建了一个具有完全相同 classpath 的单独模拟项目(来自磁盘上相同位置的相同 JAR 文件) ,另一个项目在 运行 时工作正常,它执行实际脚本。
我在这里做错了什么?
Java 1.8u241 (x64) 以及 jython-standalone-2.7.2.jar 和更早的 2.7.1 版本都会发生这种情况。堆栈跟踪中的类加载器正在尝试解析 "com".
我完全是偶然发现了罪魁祸首。
我的损坏项目使用了较旧(古老)版本的 Glazed Lists 库,即 glazedlists-1.8.0_java15.jar
。这个 JAR 似乎与 jython-standalone-2.7.2.jar
直接不兼容。一旦将它们放在相同的类路径上并尝试执行 python 脚本,该脚本会导入任何以 "com." 开头的 Java 包,您最终会遇到 InvalidJarIndexException。更新到所述 JAR 的较新版本解决了该问题。
因此,如果您在尝试 运行 Jython 时遇到类似的异常,我建议您将项目的所有依赖项更新为最新或更新的版本。事实上,即使根本不使用 Jython,这也可能是解决方案。
当我尝试在我的应用程序中使用 Jython 独立 JAR 时遇到 InvalidJarIndexException,我无法弄清楚我做错了什么。
一旦我尝试从以 "com." 开头的包中为任何 Java class 执行带有导入语句的 Python 脚本,例如:"com.foo.Bar",抛出如下异常(t运行cated):
Traceback (most recent call last):
File "<string>", line 1, in <module>
sun.misc.InvalidJarIndexException: Invalid index
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1152)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1062)
at sun.misc.URLClassPath$JarLoader.findResource(URLClassPath.java:1032)
at sun.misc.URLClassPath.findResource(URLClassPath.java:225)
at java.net.URLClassLoader.run(URLClassLoader.java:572)
at java.net.URLClassLoader.run(URLClassLoader.java:570)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:569)
at java.lang.ClassLoader.getResource(ClassLoader.java:1089)
at java.net.URLClassLoader.getResourceAsStream(URLClassLoader.java:233)
at org.python.core.ClasspathPyImporter.tryClassLoader(ClasspathPyImporter.java:221)
at org.python.core.ClasspathPyImporter.makeEntry(ClasspathPyImporter.java:208)
at org.python.core.ClasspathPyImporter.makeEntry(ClasspathPyImporter.java:18)
at org.python.core.util.importer.getModuleInfo(importer.java:174)
at org.python.core.util.importer.importer_find_module(importer.java:98)
at org.python.core.ClasspathPyImporter.ClasspathPyImporter_find_module(ClasspathPyImporter.java:134)
at org.python.core.ClasspathPyImporter$ClasspathPyImporter_find_module_exposer.__call__(Unknown Source)
at org.python.core.PyBuiltinMethodNarrow.__call__(PyBuiltinMethodNarrow.java:48)
at org.python.core.imp.find_module(imp.java:761)
at org.python.core.imp.import_next(imp.java:1158)
at org.python.core.imp.import_module_level(imp.java:1350)
at org.python.core.imp.importName(imp.java:1528)
at org.python.core.ImportFunction.__call__(__builtin__.java:1285)
at org.python.core.PyObject.__call__(PyObject.java:433)
at org.python.core.__builtin__.__import__(__builtin__.java:1232)
at org.python.core.imp.importOneAs(imp.java:1564)
at org.python.pycode._pyx0.f[=11=](<string>:1)
at org.python.pycode._pyx0.call_function(<string>)
at org.python.core.PyTableCode.call(PyTableCode.java:173)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1687)
at org.python.core.Py.exec(Py.java:1731)
at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:268)
at com.so.Script.execute(Script.java:20)
这是我在我的代码中所做的一切(我实际上是通过调用 new Script().execute()
的 JMenuItem 上的 Swing 动作来调用它的,这很可能是不相关的):
package com.so;
import org.python.core.PyDictionary;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
public class Script {
public Script() {
}
public void execute() {
PyDictionary table = new PyDictionary();
PySystemState state = new PySystemState();
PythonInterpreter interp = new PythonInterpreter(table, state);
String script;
script = "" +
"import com.foo.Bar as Bar\n" +
"";
interp.exec(script);
}
}
即使在我的class路径中没有这样的package/class也没关系。但最让我困惑的是,当我认为这必须与 classpath 相关时,创建了一个具有完全相同 classpath 的单独模拟项目(来自磁盘上相同位置的相同 JAR 文件) ,另一个项目在 运行 时工作正常,它执行实际脚本。
我在这里做错了什么?
Java 1.8u241 (x64) 以及 jython-standalone-2.7.2.jar 和更早的 2.7.1 版本都会发生这种情况。堆栈跟踪中的类加载器正在尝试解析 "com".
我完全是偶然发现了罪魁祸首。
我的损坏项目使用了较旧(古老)版本的 Glazed Lists 库,即 glazedlists-1.8.0_java15.jar
。这个 JAR 似乎与 jython-standalone-2.7.2.jar
直接不兼容。一旦将它们放在相同的类路径上并尝试执行 python 脚本,该脚本会导入任何以 "com." 开头的 Java 包,您最终会遇到 InvalidJarIndexException。更新到所述 JAR 的较新版本解决了该问题。
因此,如果您在尝试 运行 Jython 时遇到类似的异常,我建议您将项目的所有依赖项更新为最新或更新的版本。事实上,即使根本不使用 Jython,这也可能是解决方案。