CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-jetbrains-kotlin--kotlin-scripting-jvm

Kotlin JVM scripting support library that provides core functionality for executing and evaluating Kotlin scripts on the JVM platform

Pending
Overview
Eval results
Files

dependencies.mddocs/

Dependency Management

The dependency management system provides JVM classpath dependency handling including direct file dependencies, ClassLoader-based dependencies, and automatic classpath detection from execution context. It supports flexible dependency resolution for various deployment scenarios.

Capabilities

JVM Dependency

Direct classpath dependency representation using file paths to JAR files and directories.

/**
 * Represents JVM classpath dependencies using file paths
 * @param classpath List of JAR files and directories for classpath
 */
data class JvmDependency(val classpath: List<File>) : ScriptDependency {
    /**
     * Alternative constructor for vararg file entries
     * @param classpathEntries Variable number of File arguments
     */
    constructor(vararg classpathEntries: File)
}

Usage Examples:

import kotlin.script.experimental.jvm.JvmDependency
import java.io.File

// Using list of files
val dependency1 = JvmDependency(listOf(
    File("/path/to/library1.jar"),
    File("/path/to/library2.jar"),
    File("/path/to/classes/directory")
))

// Using vararg constructor
val dependency2 = JvmDependency(
    File("/path/to/library1.jar"),
    File("/path/to/library2.jar")
)

// Adding to script compilation configuration
val config = ScriptCompilationConfiguration {
    dependencies(dependency1, dependency2)
}

ClassLoader-Based Dependency

Dependency resolved from a ClassLoader, enabling dynamic dependency resolution based on runtime context.

/**
 * Dependency resolved from a ClassLoader
 * @param classLoaderGetter Function that provides ClassLoader based on configuration
 */
class JvmDependencyFromClassLoader(
    val classLoaderGetter: ClassLoaderByConfiguration
) : ScriptDependency {
    /**
     * Get the ClassLoader for the given configuration
     * @param configuration Script compilation configuration
     * @return ClassLoader containing the dependency classes
     */
    fun getClassLoader(configuration: ScriptCompilationConfiguration): ClassLoader
}

/**
 * Type alias for function that provides ClassLoader based on configuration
 */
typealias ClassLoaderByConfiguration = (ScriptCompilationConfiguration) -> ClassLoader

Usage Examples:

import kotlin.script.experimental.jvm.JvmDependencyFromClassLoader

// Using current thread context ClassLoader
val dependency1 = JvmDependencyFromClassLoader { _ ->
    Thread.currentThread().contextClassLoader
}

// Using application ClassLoader
val dependency2 = JvmDependencyFromClassLoader { _ ->
    MyApplication::class.java.classLoader
}

// Using configuration-specific ClassLoader
val dependency3 = JvmDependencyFromClassLoader { config ->
    // Determine ClassLoader based on configuration properties
    when (config.jvm.jvmTarget.value) {
        "1.8" -> legacyClassLoader
        else -> modernClassLoader
    }
}

// Adding to compilation configuration
val config = ScriptCompilationConfiguration {
    dependencies(dependency1, dependency2, dependency3)
}

JavaScript Dependency

Support for JavaScript dependencies in mixed JVM/JS environments.

/**
 * JavaScript dependency representation
 * @param path Path to JavaScript file or module
 */
data class JsDependency(val path: String) : ScriptDependency

Usage Example:

import kotlin.script.experimental.jvm.JsDependency

val jsDependency = JsDependency("/path/to/script.js")

val config = ScriptCompilationConfiguration {
    dependencies(jsDependency)
}

Dependency Resolution Extensions

Extension functions for automatic dependency resolution from various sources.

/**
 * Configure dependencies from classes in the current classpath context
 * @param classes Classes to extract classpath from
 * @param wholeClasspath Whether to include entire classpath or just specific classes
 */
fun JvmScriptCompilationConfigurationBuilder.dependenciesFromClassContext(
    vararg classes: KClass<*>,
    wholeClasspath: Boolean = false
)

/**
 * Configure dependencies from current execution context
 * @param wholeClasspath Whether to include entire current classpath
 */
fun JvmScriptCompilationConfigurationBuilder.dependenciesFromCurrentContext(
    wholeClasspath: Boolean = false
)

/**
 * Configure dependencies from a specific ClassLoader
 * @param classLoader Source ClassLoader for dependency extraction
 * @param wholeClasspath Whether to extract entire ClassLoader classpath
 */
fun JvmScriptCompilationConfigurationBuilder.dependenciesFromClassloader(
    classLoader: ClassLoader,
    wholeClasspath: Boolean = false
)

Usage Examples:

// Extract dependencies from specific classes
val config1 = ScriptCompilationConfiguration {
    jvm {
        dependenciesFromClassContext(
            String::class,
            ArrayList::class,
            MyCustomClass::class,
            wholeClasspath = false
        )
    }
}

// Include entire current classpath
val config2 = ScriptCompilationConfiguration {
    jvm {
        dependenciesFromCurrentContext(wholeClasspath = true)
    } 
}

// Use specific ClassLoader with full classpath
val config3 = ScriptCompilationConfiguration {
    jvm {
        dependenciesFromClassloader(
            MyPlugin::class.java.classLoader,
            wholeClasspath = true
        )
    }
}

Classpath Utilities

Utility functions for classpath manipulation and dependency management.

/**
 * Create new configuration with updated classpath
 * @param classpath Collection of files to add to classpath
 * @return New configuration with updated dependencies
 */
fun ScriptCompilationConfiguration.withUpdatedClasspath(
    classpath: Collection<File>
): ScriptCompilationConfiguration

/**
 * Update classpath in configuration builder
 * @param classpath Collection of files to add to classpath (null to keep existing)
 */
fun ScriptCompilationConfiguration.Builder.updateClasspath(
    classpath: Collection<File>?
)

/**
 * Update classpath in JVM configuration builder
 * @param classpath Collection of files to add to classpath (null to keep existing)
 */
fun JvmScriptCompilationConfigurationBuilder.updateClasspath(
    classpath: Collection<File>?
)

Usage Examples:

import java.io.File

// Update existing configuration with additional classpath
val originalConfig = ScriptCompilationConfiguration {
    jvm {
        dependenciesFromCurrentContext()
    }
}

val additionalClasspath = listOf(
    File("/opt/myapp/plugins/plugin1.jar"),
    File("/opt/myapp/plugins/plugin2.jar")
)

val updatedConfig = originalConfig.withUpdatedClasspath(additionalClasspath)

// Build configuration with dynamic classpath
val dynamicConfig = ScriptCompilationConfiguration {
    jvm {
        val runtimeClasspath = discoverRuntimeDependencies()
        updateClasspath(runtimeClasspath)
    }
}

Legacy Dependency Bridge

Bridge functionality for compatibility with legacy dependency resolution systems.

/**
 * Convert script dependencies to legacy classpath format
 * @return List of File objects representing classpath entries
 */
fun List<ScriptDependency>?.toClassPathOrEmpty(): List<File>

/**
 * Convert configuration to legacy dependencies format
 * @param classpath List of classpath files
 * @return Legacy ScriptDependencies object
 */
fun ScriptCompilationConfiguration.toDependencies(
    classpath: List<File>
): ScriptDependencies

/**
 * Refine configuration with additional dependencies
 * @return Result containing refined configuration or diagnostics
 */
fun ScriptCompilationConfiguration.refineWith(
    /* parameters */
): ResultWithDiagnostics<ScriptCompilationConfiguration>

Usage Example:

// Convert modern dependencies to legacy format
val modernConfig = ScriptCompilationConfiguration {
    dependencies(JvmDependency(File("/path/to/lib.jar")))
}

val legacyDependencies = modernConfig.dependencies.toClassPathOrEmpty()
val scriptDependencies = modernConfig.toDependencies(legacyDependencies)

// Use with legacy scripting APIs
val refinedConfig = modernConfig.refineWith(/* additional parameters */)

Integration Patterns

Spring Boot Integration

// Configure dependencies for Spring Boot application
val springBootConfig = ScriptCompilationConfiguration {
    jvm {
        dependenciesFromClassContext(
            SpringApplication::class,
            wholeClasspath = true
        )
    }
}

Plugin System Integration

// Dynamic plugin dependency loading
class PluginScriptCompiler {
    fun createConfigurationForPlugin(pluginClassLoader: ClassLoader) = 
        ScriptCompilationConfiguration {
            jvm {
                dependenciesFromClassloader(pluginClassLoader, wholeClasspath = false)
                // Add core application dependencies
                dependenciesFromCurrentContext(wholeClasspath = false)
            }
        }
}

Test Environment Integration

// Test-specific dependency configuration
val testConfig = ScriptCompilationConfiguration {
    jvm {
        dependenciesFromClassContext(
            JUnit5::class,
            TestClass::class,
            wholeClasspath = false
        )
    }
}

Install with Tessl CLI

npx tessl i tessl/maven-org-jetbrains-kotlin--kotlin-scripting-jvm

docs

caching.md

compiled-scripts.md

configuration.md

dependencies.md

evaluators.md

index.md

utilities.md

tile.json