2015-05-05 8 views
6

ich ein Java-Beispiel schrieb, ist der Code:Was ist der Unterschied zwischen Jython-Standalone-2.7.0.jar und jython-2.7.0.jar ist

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

In meinem pom.xml, wenn ich benutze:

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

dann kann ich java -jar target/jython-example-1.0-SNAPSHOT.jar successfuly laufen, nebenbei gesagt, habe ich maven-assembly-plugin ein lauffähiges Glas zu bauen.

wenn ich benutze:

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

dann, wenn ich java -jar target/jython-example-1.0-SNAPSHOT.jar laufen, werde ich immer folgende Fehlermeldung erhalten:

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 

Es scheint, die pyEnginenull ist.

So frage ich mich, was ist der Unterschied zwischen jython-standalone-2.7.0.jar und jython-2.7.0.jar

+0

Der Unterschied besteht darin, dass das eigenständige Jar den Cache nicht verwendet und so (theoretisch) für Endbenutzer bereitgestellt werden kann. Dies steht im Einklang damit, dass der Code die Website-Module nicht importieren kann. - Off topic - Können Sie weitere Informationen zum Erstellen von ausführbaren Gläsern bereitstellen. Ich habe Probleme damit in 2.7 –

Antwort

2

ich der Hauptunterschied verursacht Ihr Problem glauben, dass die jython-Standalone-Glas bietet Lib/(die site.py enthält), während die jython jar nicht der Fall ist.

https://github.com/scijava/jython-shaded gibt eine ausführlichere Beschreibung des Problems sowie andere Probleme und bietet eine alternative Glas, um einige Probleme in der Beschreibung zu beachten.

Ich habe keine Erfahrung mit scijava: jython-shaded, aber ich habe es in Ihren Pom (für meine Einrichtung musste ich auch jdk.version zu 1.7 und zu JythonExample ändern) und Ihr Beispiel läuft.

7

Ein Problem, das ich gerade mit dem gleichen Fehler entdeckt habe, ist, dass der Maven Build 2.7.0 den lib Ordner nicht enthält. Dies ist wahrscheinlich ein Build-Fehler für den Release-Build. Ich musste den b2-Build nach oben verschieben, der den Lib-Ordner im mitgelieferten Jar ordnungsgemäß enthält.

Problem Maven 2.7.0 jar:
<dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.0</version> </dependency>

Arbeiten Maven 2.7.1b2, die den Ordner lib enthält:
<dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.1b2</version> </dependency>

HINWEIS: Wenn Sie das Glas direkt aus dem Jython Website herunterladen es tut Schließen Sie den lib-Ordner korrekt ein. Es ist nur die Maven-Repository-Version.

Verwandte Themen