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,这也可能是解决方案。