Reputation: 2675
I want to run kotlin code as script from java with Java Scripting API similar to this for javascript:
import javax.script.*;
public class EvalScript {
public static void main(String[] args) throws Exception {
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
// evaluate JavaScript code from String
engine.eval("print('Hello, World')");
}
}
or with similar APIs like this.
Upvotes: 7
Views: 5648
Reputation: 22283
Yes, it's possible starting from the Kotlin 1.1: http://kotlinlang.org/docs/reference/whatsnew11.html#javaxscript-support
KEEP-75 has an example of the JSR-223 API call:
val engine = ScriptEngineManager().getEngineByExtension("main.kts")!! engine.eval(""" @file:DependsOn("junit:junit:4.11") org.junit.Assert.assertTrue(true) println("Hello, World!") """)
Configuration below adds Kotlin scripts engine to my Kotlin 1.2 project:
META-INF/services/javax.script.ScriptEngineFactory
file with the content from the https://github.com/JetBrains/kotlin/blob/master/libraries/examples/kotlin-jsr223-local-example/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
2 libraries:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-script-runtime</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-script-util</artifactId>
<version>${kotlin.version}</version>
</dependency>
Update:
Starting from Kotlin 1.2.20 kotlin-script-util
doesn't depend on kotlin-compiler
explicitly (see https://youtrack.jetbrains.com/issue/KT-17561). So one more module should be provided (as of the build file in example project):
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-compiler-embeddable</artifactId>
<version>${kotlin.version}</version>
</dependency>
Upvotes: 10
Reputation: 97148
Kotlin support for the Java Scripting API is planned, but as of version 1.0.3 is not available yet. For the mean time, you can try to use an existing open-source implementation.
Upvotes: 4