Java has a ScriptEngine system that allows you to run/evaluate statements in a different language.
I know for a fact that JavaScript is supported, but I couldn't find any other languages to work with it.
Is, for example, Ruby implemented?
5 Answers
Here is a script to determine all languages on your system:
import java.util.List;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngineFactory;
public class Test {
public static void main(String[] args)
{
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);
}
}
}
Hope this helps.
Comments
..I know for a fact that JavaScript is supported,..
ECMAscript, technically.
.. but I couldn't find any other languages to work with it. Is, for example, Ruby implemented?
No. The ECMAscript engine is the only one included by default, the last time I heard.
Update
The comments of Pointy below, suggest that the Nashorn engine has been deprecated and will be removed 'soon'.
9 Comments
Not in ScriptEngine, but you can still use BSF. From the Apache Commons Bean Scripting Framework, you can find it's Documentation here. -
BSF 2.x supports several scripting languages currently:
- Javascript (using Rhino ECMAScript, from the Mozilla project)
- NetRexx (an extension of the IBM REXX scripting language in Java)
- Commons JEXL
- Python (using Jython)
- Tcl (using Jacl)
- XSLT Stylesheets (as a component of Apache XML project's Xalan and Xerces)
In addition, the following languages are supported with their own BSF engines:
Comments
The Java ScriptEngine API will work with all JSR-223 Scripting Languages. I haven't found a well documented complete list of these before but this post does a pretty good job, Where can I find a list of available JSR-223 scripting languages? Here is one list from that post,
JSR-223 script engines
- AWK
- BeanShell
- ejs
- FreeMarker
- Groovy
- Jaskell
- Java
- JavaScript
- JavaScript (Web Browser)
- Jelly
- JEP
- Jexl
- jst
- JudoScript
- JUEL
- OGNL
- Pnuts
- Python
- Ruby
- Scheme
- Sleep
- Tcl
- Velocity
- XPath
- XSLT
JSR 223 script engines maintained elsewhere
- JavaFX Script
- ABCL
- AppleScript
- Bex script
- OCaml Scripting Project
- PHP
- PHP (another one)
- Python
- Smalltalk
- CajuScript
- MathEclipse
Most have a special implementation for it to work. For example python alone will not work you need the Jython jar added to the class path. Same for Ruby you'll need JRuby.
2 Comments
java.util.ServiceLoader mechanism (Service Discovery / Service Provider Interface). This means that in a library in META-INF\services a file is created that points to an implementation of the ScriptEngineFactory interface. It depends on the specific language if they add this in the "core" jar of the scripting language, or if this is done via a separate jar. For example beanshell add this in the core org.apache-extras.beanshell:bsh jar since version 2.0. Adding this jar to your classpath is sufficient to be able to use in ScriptEngine.There are several other languages available. For instance, Jython (Python implementation in Java). The way to use other languages is by adding the JAR file to CLASSPATH and making a reference to the right name.
For Ruby, there is JRuby. See the following: https://github.com/jruby/jruby/wiki/JavaIntegration
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine rubyEngine = m.getEngineByName("jruby");