Kotlin ep.kt -run


What is the point in making double work with:

kotlin ep.kt -include-runtime -d ep.jar
java -jar ep.jar 

Why not just make it a single command?

kotlin ep.kt -run


If you have a single-file program that you want to execute quickly, you can save it to a .kts file, and compile and run it as “kotlinc -script foo.kts”


It is not a script. I want finally to package it as a single file executable. Saving it to .kts doesn’t produce any output:

ep.kts:6:10: warning: parameter 'args' is never used
fun main(args: Array<String>) {

Because my code is in main and script mode doesn’t evaluate it.

And if I run it without renaming to .kts then:

exception: java.lang.RuntimeException: Failed to evaluate script: java.lang.IllegalStateException: Script must be parsed
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileScript(KotlinToJVMBytecodeCompiler.kt:526)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileAndExecuteScript(KotlinToJVMBytecodeCompiler.kt:226)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:175)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:54)
        at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.java:178)
        at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.java:125)
        at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.java:52)
        at org.jetbrains.kotlin.cli.common.CLICompiler.doMainNoExit(CLICompiler.java:379)
        at org.jetbrains.kotlin.cli.common.CLICompiler.doMain(CLICompiler.java:369)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler$Companion.main(K2JVMCompiler.kt:283)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.main(K2JVMCompiler.kt)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.jetbrains.kotlin.preloading.Preloader.run(Preloader.java:73)
        at org.jetbrains.kotlin.preloading.Preloader.main(Preloader.java:35)
Caused by: java.lang.IllegalStateException: Script must be parsed
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileScript(KotlinToJVMBytecodeCompiler.kt:522)
        ... 16 more

I don’t understand why .kts scripts should not execute main() if it is present once parsing is over. I also don’t understand why a special extension rule is enforced when I want to run Kotlin source in -script mode.


It seems that a bash function or alias would be your salvation. You could even call it kotlin and have it shadow the real interpreter (still accessible through it’s full path). Btw. the kotlin way is exactly the way that java does stuff as well except that the creation of the jar file is a bit trickier than the kotlin command.


@pdvrieze I am not looking for a quick hack. I am interested in design decisions behind the behavior.