2017-07-11 4 views
1

Ich habe in meiner Anwendung seit einiger Zeit dynamischen Code über JSR-223 ausgeführt. Die grundlegende Logik ist:Ausführen von dynamischem Java-Code über JSR-223

ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); 
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(engineName); 
final CompiledScript compiled = ((Compilable) scriptEngine).compile(script); 
Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE); 
bindings.put("key", value); 
compiled.eval(bindings); 

Dies funktioniert hervorragend für Nashorn und Groovy Skript-Engines. Es wäre jedoch großartig, wenn es bei der Erweiterung der Logik der Anwendung nicht erforderlich wäre, die Syntax und die Tricks einer anderen Sprache zu kennen - der Basiscode ist schließlich in Java.

Bei der Auflistung der Einbaumotoren gibt keine solche vorhanden für Java zu sein scheinen:

ScriptEngineManager manager = new ScriptEngineManager(); 
List<ScriptEngineFactory> factoryList = manager.getEngineFactories(); 
for (ScriptEngineFactory factory : factoryList) { 
    log.debug(factory.getLanguageName()); 
} 

Ich habe ein paar dynamische Java-Bibliotheken gefunden, aber sie scheinen nicht mehr gehalten werden. Ich denke, es ist möglich, etwas zusammen mit der javax.tools.JavaCompiler zu schreiben, aber ich hoffe, dass ich etwas Grundlegendes vermisse und es gibt Arbeitsmöglichkeiten für so etwas, das bereits existiert. Ich bin mir auch der Grundlagen von jshell in Java 9 bewusst, aber ich habe noch nichts darüber gehört, dass Code mit dem ScriptEngineManager ausgeführt werden kann.

Wie sollte ich die Skripterstellung mithilfe der Java-Sprache selbst implementieren? Gibt es irgendwelche Optionen darüber hinaus, meine eigene javax.script.ScriptEngine mit Hilfe von javax.tools.JavaCompiler zu implementieren?

+0

Sie wollen also eine Java-Skript-Engine, die in der JVM ausgeführt wird? Klingt nicht besonders effizient. Um dynamischen Code aus Text zu generieren, macht JavaCompiler den Trick – efekctive

Antwort

1

Schauen Sie sich die SciJava Java Scripting plugin

Docs sind ein bisschen dünn. Siehe Maven Repository und beachten Sie, dass der Resolver das Repository ImageJ Releases ist (http://maven.imagej.net/content/repositories/releases/)

+0

Danke, das ist das nächste, was ich bisher gesehen habe. Ich hatte noch nicht die Zeit, es im Detail zu überprüfen, aber es sieht zumindest vielversprechend aus, solange es tut, was es verspricht. Ich sehe, Sie haben bereits ein Problem in ihrem Repository eingereicht, so müssen Sie es auch selbst getestet haben. Es wäre großartig, wenn Sie weitere Details zu Ihrer Erfahrung hinzufügen könnten. – Tarmo

+0

Mein Problem verweist auf Komponententests, die die Probleme zeigen, die ich bei jeder JSR223-Implementierung gefunden habe. Der Goldstandard ist Nashorn, gefolgt von Jython. Alle anderen haben Probleme, die scheinbar relativ einfach zu lösen sind, aber diese Probleme verhindern meine Verwendung. –

+0

Bitte poste nicht einfach ein Werkzeug oder eine Bibliothek als Antwort. Zeigen Sie zumindest, wie das Problem gelöst wird (http://meta.stackoverflow.com/a/251605), in der Antwort selbst. – g00glen00b

0

Haben Sie JShell tool und API in # java9 gesehen? Es basiert nicht auf JSR-223 - trotzdem ist es eine Java-API (und ein Befehlszeilentool), die Java als "Skriptsprache" verwendet.

+0

Ja, ich habe es gesehen. Ich suche nach einer Lösung, die speziell mit JSR-223 arbeitet, weil andere Sprachen bereits über diese Schnittstelle verwendet werden und ich vermeiden möchte, eine Vielzahl von zu wartenden Schnittstellen zu erstellen. Vielen Dank für den Vorschlag, aber – Tarmo

Verwandte Themen