Rozwinąłem mój program o obsługę silnika skryptów Pythona jako alternatywę dla JavaScript (Python jest ok 3x szybszy wg moich testów) i chciałem żeby działał również w aplecie.
Problem ogromnego rozmiaru udało mi się "rozwiązać" ładowaniem JARa z HDD:
static void initManager(){
if (m != null)
return;
File f=new File(System.getProperty("user.home") + "/.JavaBlock/modules/jython.jar");
if(f.exists())
try {
URL[] urls = new URL[]{
f.toURL()
};
ClassLoader load = new URLClassLoader(urls);
m = new ScriptEngineManager(load);
} catch (MalformedURLException ex) {
System.out.println("Error");
m = new ScriptEngineManager();
}
else{
System.out.println("Jython not found");
m = new ScriptEngineManager();
}
}
Silnik jest wykrywany i pobiera się przez m.getEngineByName("python")
, niestety podczas próby wykonania jakiegokolwiek skryptu wywala NullPointerException:
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at org.python.core.StdoutWrapper.getObject(StdoutWrapper.java:16)
at org.python.core.StdoutWrapper.myFile(StdoutWrapper.java:25)
at org.python.core.StdoutWrapper.flushLine(StdoutWrapper.java:79)
at org.python.core.Py.flushLine(Py.java:1401)
at org.python.core.Py.displayException(Py.java:1063)
at org.python.core.PyException.printStackTrace(PyException.java:79)
at org.python.core.PyException.toString(PyException.java:98)
at java.lang.Throwable.<init>(Throwable.java:242)
at java.lang.Exception.<init>(Exception.java:77)
at javax.script.ScriptException.<init>(ScriptException.java:46)
at org.python.jsr223.PyScriptEngine.scriptException(PyScriptEngine.java:201)
at org.python.jsr223.PyScriptEngine.compileScript(PyScriptEngine.java:75)
at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:31)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
at gui.Interpreter.addAllFlows(Interpreter.java:647)
...
Ta linijka w kodzie Jythona odwołuje się do PySystemState, gdzie chce zwrócić stdout (który jest tworzony w PySystemState jako <stdout>)
Ten sam problem występuje w przypadku Web Start (jnlp). Zarówno sam program jak i Jython są podpisane (tym samym certyfikatem, bez niego Jython nie umiał dostać się do swoich zzipowanych bibliotek na HDD).
Program uruchamiany z HDD bezpośrednio działa dobrze.
Wie ktoś może jak to naprawić?