В чем разница между jython-standalone-2.7.0.jar и jython-2.7.0.jar

Я написал пример Java, код:

import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.List;

class JythonExample {

  public static void main(String args[]) throws ScriptException {
    listEngines();

    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine pyEngine = mgr.getEngineByName("python");

    try {
      pyEngine.eval("print \"Python - Hello, world!\"");
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    final PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.exec("print \"Python - Hello, world!\"");

    PyObject result = interpreter.eval("2 + 3");
    System.out.println(result.toString());
  }

  public static void listEngines(){
    ScriptEngineManager mgr = new ScriptEngineManager();
    List<ScriptEngineFactory> factories =
        mgr.getEngineFactories();
    for (ScriptEngineFactory factory: factories) {
      System.out.println("ScriptEngineFactory Info");
      String engName = factory.getEngineName();
      String engVersion = factory.getEngineVersion();
      String langName = factory.getLanguageName();
      String langVersion = factory.getLanguageVersion();
      System.out.printf("\tScript Engine: %s (%s)\n",
          engName, engVersion);
      List<String> engNames = factory.getNames();
      for(String name: engNames) {
        System.out.printf("\tEngine Alias: %s\n", name);
      }
      System.out.printf("\tLanguage: %s (%s)\n",
          langName, langVersion);
    }
  }
}

В моем pom.xml, если я использую:

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>
</dependency>

тогда я могу успешно запустить java -jar target/jython-example-1.0-SNAPSHOT.jar, кстати, я использовал maven-assembly-plugin для создания исполняемой банки.

если я использую:

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython</artifactId>
    <version>2.7.0</version>
</dependency>

затем, когда я запускаю java -jar target/jython-example-1.0-SNAPSHOT.jar, я всегда получаю следующую ошибку:

ScriptEngineFactory Info
    Script Engine: jython (2.7.0)
    Engine Alias: python
    Engine Alias: jython
    Language: python (2.7)
ScriptEngineFactory Info
    Script Engine: Oracle Nashorn (1.8.0_31)
    Engine Alias: nashorn
    Engine Alias: Nashorn
    Engine Alias: js
    Engine Alias: JS
    Engine Alias: JavaScript
    Engine Alias: javascript
    Engine Alias: ECMAScript
    Engine Alias: ecmascript
    Language: ECMAScript (ECMA - 262 Edition 5.1)
java.lang.NullPointerException
    at me.soulmachine.JythonExample.main(JythonExample.java:21)
Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site
Determine if the following attributes are correct:
  * sys.path: ['/home/programmer/src/github/JythonExample/JythonExample/target/Lib', '__classpath__', '__pyclasspath__/']
    This attribute might be including the wrong directories, such as from CPython
  * sys.prefix: /home/programmer/src/github/JythonExample/JythonExample/target
    This attribute is set by the system property python.home, although it can
    be often automatically determined by the location of the Jython jar file

You can use the -S option or python.import.site=false to not import the site module

Кажется, pyEngine это null.

Так что мне интересно, в чем разница между jython-standalone-2.7.0.jar и jython-2.7.0.jar


person soulmachine    schedule 05.05.2015    source источник
comment
Разница в том, что автономный jar-файл не использует кеш и поэтому (теоретически) может быть развернут для конечных пользователей. Это согласуется с тем, что ваш код не может импортировать модули сайта. -- Не по теме. Можете ли вы предоставить дополнительную информацию о создании исполняемых jar-файлов. У меня проблемы с ним в 2.7   -  person Paul Smith    schedule 06.05.2015


Ответы (2)


Одна проблема, которую я только что обнаружил с той же ошибкой, заключается в том, что сборка maven 2.7.0 не включает папку lib. Вероятно, это ошибка сборки для релизной сборки. Мне пришлось переместить сборку b2, которая правильно включает папку lib в прилагаемом банке.

Проблема maven 2.7.0 jar:
<dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.0</version> </dependency>

Рабочий maven 2.7.1b2, включающий папку lib:
<dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.1b2</version> </dependency>

ПРИМЕЧАНИЕ. Если вы загружаете банку непосредственно с сайта Jython, она правильно включает папку lib. Это просто версия репозитория maven.

person Tim Cederquist    schedule 31.01.2016

Я считаю, что основное различие, вызывающее вашу проблему, заключается в том, что Jython-Standalone jar предоставляет Lib/ (который содержит site.py), а jython JAR - нет.

https://github.com/scijava/jython-shaded дает более подробное описание проблема, а также другие проблемы, и предоставляет альтернативный jar для решения некоторых проблем, отмеченных в описании.

У меня нет опыта работы с scijava:jython-shaded, но я заменил его на ваш pom (для моей настройки мне также пришлось изменить jdk.version на 1.7 и на JythonExample), и ваш пример запускается.

person Phil Brown    schedule 24.08.2015