NullPointerException w aplecie

0

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ć?

0

Pokombinowałem i znalazłem jeszcze jeden wyjątek, który pominąłem (może dlatego, że jest zaraz za tymi gdzie nie umie znaleźć jythona w ./lib), a mianowicie okazuje się że interpreter nie może startować, bo nie ma praw do user.dir, mimo że jython.jar jest podpisany. Może też dlatego, że ten jar jest ładowany z ClassLoadera i nie znajduje się w Class Path, przez co certyfikat nie jest ładowany.

Jak dodam:

grant {
   permission java.security.AllPermission;
};

do ~/.java.policy to wszystko działa pięknie, ale wiadomo jakim kosztem. Dodanie linku (codeBase "http:/javablock.sf.net", codeBase "http:/javablock.sf.net/*") nie działa (tzn. prawa nie są przyznawane)

Czy jest jakiś sposób, żeby te prawa przyznać, ale bez kombinowania z tym plikiem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1