Kotlin scripting support utilities library that provides infrastructure for implementing Kotlin script execution, including JSR-223 script engine implementations, dependency resolution, and utilities for classpath management in scripting contexts
—
The kotlin-script-util library provides two JSR-223 compliant script engine implementations for executing Kotlin code within Java applications. Both engines allow dynamic compilation and execution of Kotlin scripts with different performance characteristics.
Base factory class that provides common functionality for all Kotlin JSR-223 script engine factories.
abstract class KotlinJsr223JvmScriptEngineFactoryBase : ScriptEngineFactory {
abstract fun getScriptEngine(): ScriptEngine
// ScriptEngineFactory implementation
fun getEngineName(): String = "kotlin"
fun getEngineVersion(): String
fun getExtensions(): List<String> = listOf("kts")
fun getLanguageName(): String = "kotlin"
fun getLanguageVersion(): String
fun getMimeTypes(): List<String> = listOf("text/x-kotlin")
fun getNames(): List<String> = listOf("kotlin")
fun getParameter(key: String): Any?
fun getMethodCallSyntax(obj: String, m: String, vararg args: String): String
fun getOutputStatement(toDisplay: String): String
fun getProgram(vararg statements: String): String
}Factory that creates script engines using local compilation.
class KotlinJsr223JvmLocalScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase {
fun getScriptEngine(): ScriptEngine
}Usage Example:
import org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory
val factory = KotlinJsr223JvmLocalScriptEngineFactory()
val engine = factory.scriptEngine
// Execute simple expressions
val result = engine.eval("println(\"Hello from Kotlin script!\")")Factory that creates script engines using daemon-based compilation for better performance with repeated script execution.
class KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase {
fun getScriptEngine(): ScriptEngine
}Usage Example:
import org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory
val factory = KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory()
val engine = factory.scriptEngine
// Better for repeated script execution
for (i in 1..10) {
val result = engine.eval("Math.pow($i.toDouble(), 2.0)")
println("$i squared = $result")
}Script engine implementation using local compilation.
class KotlinJsr223JvmLocalScriptEngine(
factory: ScriptEngineFactory,
val templateClasspath: List<File>,
templateClassName: String,
val getScriptArgs: (ScriptContext, Array<out KClass<out Any>>?) -> ScriptArgsWithTypes?,
val scriptArgsTypes: Array<out KClass<out Any>>?
) : KotlinJsr223JvmScriptEngineBase(factory), KotlinJsr223JvmInvocableScriptEngine {
val replCompiler: ReplCompiler
val replEvaluator: ReplFullEvaluator
val state: IReplStageState<*>
fun createState(lock: ReentrantReadWriteLock): IReplStageState<*>
fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes?
}Script engine implementation using daemon-based compilation for improved performance.
class KotlinJsr223JvmDaemonCompileScriptEngine(
factory: ScriptEngineFactory,
compilerClasspath: List<File>,
templateClasspath: List<File>,
templateClassName: String,
val getScriptArgs: (ScriptContext, Array<out KClass<out Any>>?) -> ScriptArgsWithTypes?,
val scriptArgsTypes: Array<out KClass<out Any>>?,
compilerOut: OutputStream = System.err
) : KotlinJsr223JvmScriptEngineBase(factory), KotlinJsr223JvmInvocableScriptEngine {
val replCompiler: ReplCompilerWithoutCheck
val localEvaluator: GenericReplCompilingEvaluator
val replEvaluator: ReplFullEvaluator
val state: IReplStageState<*>
fun createState(lock: ReentrantReadWriteLock): IReplStageState<*>
fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes?
}Both script engines support passing data to scripts through bindings:
import org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory
val engine = KotlinJsr223JvmLocalScriptEngineFactory().scriptEngine
// Create bindings and add variables
val bindings = engine.createBindings()
bindings["name"] = "World"
bindings["count"] = 42
// Execute script with bindings
val result = engine.eval("""
println("Hello, ${"$"}name!")
count * 2
""".trimIndent(), bindings)
println("Result: $result") // Result: 84Script engines throw ScriptException for compilation and runtime errors:
import javax.script.ScriptException
val engine = KotlinJsr223JvmLocalScriptEngineFactory().scriptEngine
try {
engine.eval("invalid syntax @@#")
} catch (e: ScriptException) {
println("Script compilation failed: ${e.message}")
}
try {
engine.eval("throw RuntimeException(\"Script error\")")
} catch (e: ScriptException) {
println("Script execution failed: ${e.message}")
}// Base interface for invocable script engines
interface KotlinJsr223JvmInvocableScriptEngine {
val replEvaluator: ReplFullEvaluator
val state: IReplStageState<*>
fun createState(lock: ReentrantReadWriteLock): IReplStageState<*>
fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes?
}
// Base class for all Kotlin JSR-223 script engines
abstract class KotlinJsr223JvmScriptEngineBase(
factory: ScriptEngineFactory
) : AbstractScriptEngine(factory.context) {
fun eval(script: String): Any?
fun eval(script: String, context: ScriptContext): Any?
fun eval(reader: Reader): Any?
fun eval(reader: Reader, context: ScriptContext): Any?
fun createBindings(): Bindings
fun getFactory(): ScriptEngineFactory
}
// Script arguments with type information
data class ScriptArgsWithTypes(
val scriptArgs: Array<out Any?>,
val scriptArgsTypes: Array<out KClass<out Any>>
)
// Standard Java/Kotlin types used by script engines
typealias ReentrantReadWriteLock = java.util.concurrent.locks.ReentrantReadWriteLock
typealias OutputStream = java.io.OutputStreamInstall with Tessl CLI
npx tessl i tessl/maven-org-jetbrains-kotlin--kotlin-script-util