sun.mis c .InvalidJarIndexException: недопустимый индекс при импорте из пакета com. * в автономном Jython - PullRequest
0 голосов
/ 17 апреля 2020

Я получаю InvalidJarIndexException при попытке использовать автономный JAR Jython внутри моего приложения, и я не могу понять, что я делаю неправильно.

Как только я пытаюсь выполнить Python скрипт с оператором импорта для любого Java класса из пакета, начинающегося с «com.», например: «com.foo.Bar», следующее исключение (усечено):

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$2.run(URLClassLoader.java:572)
    at java.net.URLClassLoader$2.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$0(<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)

Вот все, что я делаю в своем коде (на самом деле я вызываю это через действие Swing на JMenuItem, вызывающем new Script().execute(), что, скорее всего, не имеет значения):

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);
    }
}

Это даже не имеет значения что в моем classpath нет такого пакета / класса. Но что меня больше всего беспокоит, так это то, что когда я, думая, что это связано с classpath, создал отдельный фиктивный проект с точно таким же classpath (те же файлы JAR из тех же мест на диске), другой проект прекрасно работает при запуске и он выполняет настоящий скрипт.

Что я мог сделать не так здесь?

Это происходит с Java 1.8u241 (x64) и с обоими jython-standalone-2.7.2. jar и более ранняя версия 2.7.1. ClassLoader в трассировке стека пытается разрешить «com».

1 Ответ

0 голосов
/ 20 апреля 2020

Я нашел виновника совершенно случайно.

Мой сломанный проект использовал более старую (древнюю) версию библиотеки Glazed Lists, а именно glazedlists-1.8.0_java15.jar. Этот JAR кажется несовместимым с jython-standalone-2.7.2.jar. Как только вы поместите их в один и тот же путь к классу и попытаетесь выполнить скрипт python, который импортирует любой пакет Java, начинающийся с «com.», Вы получите InvalidJarIndexException. Обновление до более новой версии указанного JAR решило проблему.

Поэтому, если вы столкнулись с подобным исключением при попытке запустить Jython, я предлагаю вам обновить все зависимости вашего проекта до последних или более новых версий. На самом деле это, вероятно, будет решением, даже если вообще не использовать Jython.

...