CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-jetbrains-kotlin--kotlin-script-util

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

Pending
Overview
Eval results
Files

jsr223-engines.mddocs/

JSR-223 Script Engines

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.

Script Engine Factories

KotlinJsr223JvmScriptEngineFactoryBase

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
}

KotlinJsr223JvmLocalScriptEngineFactory

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!\")")

KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory

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 Implementations

KotlinJsr223JvmLocalScriptEngine

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?
}

KotlinJsr223JvmDaemonCompileScriptEngine

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?
}

Working with Bindings

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: 84

Error Handling

Script 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}")
}

Types

// 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.OutputStream

Install with Tessl CLI

npx tessl i tessl/maven-org-jetbrains-kotlin--kotlin-script-util

docs

classpath-utilities.md

dependency-resolution.md

index.md

jsr223-engines.md

script-templates.md

tile.json