2014-02-11 2 views
1

После Using Jython Within Java Applications я мог бы интегрировать Java и Jython (Java-методы могут вызывать скрипты python). Код python находится внутри каталога py. Jython использует команду sys.path.append("py") для поиска сценариев Jython.Поиск файлов в файле jar (включая файлы классов Jython в файле jar)

Затем я попытался интегрировать все файлы в один файл jar.

Для предварительного шага я мог сгенерировать один файл jar и скопировать каталог py вместе с файлом jar, и он отлично работает. Я использовал IntelliJ IDEA для создания файла jar.

│   └── py 
│    ├── Context$py.class 
│    ├── Context.py 
│    ├── Host$py.class 
│    └── Host.py 
├── aggregationPython.jar <-- Generated jar file 

Для следующего шага, я попытался скопировать каталог ру в файле фляги, я также использовал IntelliJ для этого.

Я проверил, что файл jar имеет папку py в файле jar. Вы видите, что каталог py находится в корневом файле jar.

enter image description here

Однако, когда я выполнил .jar файл, я получил сообщение об ошибке говорящее модуль Jython отсутствует.

> java -jar aggregationPython.jar 
Exception in thread "main" ImportError: No module named Host 

Что может быть неправильным? Я предположил, что каталог py может быть сохранен в файле jar, который будет найден точно так же, как он найден вне файла jar. Что не так с этим допущением?

+0

Попробуйте поместить файлы python в верхнюю папку файла jar и посмотреть, работает ли это. –

+0

@ daniel kullmann: Он уже находится в верхнем каталоге; то, что показано в вопросе, - это распакованный файл jar. – prosseek

+0

Я имел в виду без каталога py, так что, например, Host.py находится непосредственно в верхней папке zip-файла –

ответ

0

Файлы класса Jython находятся в файле jar, а путь поиска для Jython не имеет значения, находятся ли они в файле jar или нет. Все, что нам нужно, - это найти, где находятся классы Jython, и позволить Jython об этом знать.

Из намека на это сообщение (How to get the path of a running JAR file?) можно найти путь, в котором находится файл jar. Файлы классов можно найти в каталоге местоположения + «py».

Для целей разработки исходный код Jython в исходной директории также должен быть указан («src/py»).

enter image description here

String runningDir = Simulate.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
String jarPointer = "py"; 
String joinedPath = new File(runningDir, jarPointer).toString(); 

String pythonSrcPath = "/Users/smcho/code/PycharmProjects/aggregator/src"; 
JythonObjectFactory.setupPath(new String[]{joinedPath, "src/py"}); 

После этой модификации Jython мог правильно найти классы.

Это метод setupPath для настройки пути поиска Jython.

public static void setupPath(String[] paths) 
{ 
    PythonInterpreter interpreter = new PythonInterpreter(); 

    interpreter.exec("import sys;"); 
    for (int i = 0; i < paths.length; i++) { 
     interpreter.exec(String.format("sys.path.append(\"%s\")", paths[i])); 
    } 
} 
Смежные вопросы