10

Is there any library that allows us to run a JavaScript code (as a String) from Scala code? Whether the JavaScript code is running in the JVM or a spawned JavaScript interpreter is not important.

3 Answers 3

12

If you want to use the current JVM process, use JVM's ScriptEngine.

import javax.script.ScriptEngineManager

val engine = new ScriptEngineManager().getEngineByMimeType("text/javascript")
val result = engine.eval("1 + 1")
println(result)

This uses Rhino for JDK 7 and Nashorn for JDK 8.

The interaction between Java code and Nashorn is rather seamless.


If you want to use a new process, use ProcessBuilder with an external JS runtime.

import java.io.ByteArrayInputStream
import scala.sys.process._

val input =  new ByteArrayInputStream("console.log(1 + 1)".getBytes)
val result = ("node" #< input).!!
println(result)

This will give you perhaps the fastest execution if the JS is heavy on CPU usage. It also allows the JS to use the Node.js APIs, though it requires Node.js to be installed.


If you want to use the current JS process (i.e. if you are using Scala.js),

import scala.scalajs.js

val result = js.eval("1 + 1")
println(result)
Sign up to request clarification or add additional context in comments.

2 Comments

Great answer! Thanks!
Regarding the second example, to make it work it should: 1) import scala.sys.process._ 2) fix the input redirection method to " #<"
2

Try to use Rhino or Nashorn it's on Java, but you can use it from Scala

Comments

2

You can use Apache's Common BSF which uses Mozilla Rhino internally.

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.