28

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?

asked Nov 16, 2013 at 1:02

5 Answers 5

17

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.

answered Jun 26, 2016 at 13:38
Sign up to request clarification or add additional context in comments.

Comments

12

..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'.

answered Nov 16, 2013 at 1:12

9 Comments

Even the JavaScript version typically shipped in JREs is not required and you should have low expectations about compatibility across versions.
Note that JavaScript support is deprecated and will go away with (I think) release 13 of the JDK/JVM.
Well I am the "canary" at work using JDK 11 (we're really conservative) and our build process uses some Nashorn-based JavaScript, and the runtime spits out "it's going away" messages. I think I read that they got very little feedback from people relying on JavaScript support and so it dropped out of the roadmap.
I remember it was just a few years ago when Nashorn was such a big deal; I saw a presentation about the architecture at a Strange Loop conference. I guess they decided it was a waste of resources (by their accounting of value).
As of Java 15 the Nashorn engine is not part of the JDK anymore. With the deprecation of this engine, afaik there is no scripting engine included in the JDK. The engine SPI is supported, it is just the built-in sample implementation that is not there.
|
9
answered Nov 16, 2013 at 1:13

Comments

8

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.

answered Jul 7, 2014 at 1:29

2 Comments

Scala is supported too I think?
ScriptEngine languages are self-registering via the 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.
5

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");
answered Nov 16, 2013 at 1:18

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.