1

I tried to compile the javax.script example from the Kotlin web site.

import javax.script.*

fun main () {
  val engine = ScriptEngineManager().getEngineByExtension("kts")!!
  engine.eval("val x = 3")
  println (engine.eval("x + 2"))  // Prints out 5
}

But it throws a NullPointerException:

$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -jar hello.jar 
Exception in thread "main" java.lang.NullPointerException
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)

Does anybody know what is wrong here? Do I need some additional compile options?

I am using:

kotlinc-jvm 1.4.10 (JRE 11.0.9+11-post-Debian-1deb10u1)

Update: some more tests

$ kotlinc-jvm hello.kt 
$ kotlin HelloKt
Exception in thread "main" java.lang.NoClassDefFoundError: javax/script/ScriptEngineManager
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
        at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
        at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
Caused by: java.lang.ClassNotFoundException: javax.script.ScriptEngineManager
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 9 more
$ kotlin -cp .:kotlin-stdlib.jar:kotlin-main-kts.jar:kotlin-compiler.jar:livetribe-jsr223.jar HelloKt
Exception in thread "main" java.lang.NullPointerException
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
        at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
        at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
$ java -cp .:kotlin-stdlib.jar:kotlin-main-kts.jar:kotlin-compiler.jar:livetribe-jsr223.jar HelloKt
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory not found
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider org.jetbrains.kotlin.mainKts.jsr223.KotlinJsr223MainKtsScriptEngineFactory could not be instantiated
Exception in thread "main" java.lang.NullPointerException
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)

NullPointerExceptions everywhere, although "Kotlin's type system is aimed to eliminate NullPointerException's from our code".

Funny. Somehow.

Update: Java example

I want to port the following Java/Groovy example to Kotlin/Kotlin.

Source
import groovy.util.Eval;

public class MetaEval
{
  public static void main (String... args)
  {
    System.out.println (Eval.me ("2+3"));
  }
}
Compile
$ /usr/lib/jvm/java-8-openjdk-amd64/bin/javac -cp .:/usr/share/java/groovy-all.jar MetaEval.java
Run
$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp .:/usr/share/java/groovy-all.jar MetaEval 
5
ceving
  • 21,900
  • 13
  • 104
  • 178
  • Engine for `kts` extension is not a part of JVM (and not a part of kotlin runtime). I believe you are missing some dependencies in classpath when running jar. Maybe [this one](https://github.com/JetBrains/kotlin/blob/008da87160c3704846dab2b18c0c9055dbab95cc/libraries/examples/kotlin-jsr223-local-example/build.gradle.kts#L19)? – Михаил Нафталь Oct 27 '20 at 21:28
  • @МихаилНафталь How to specify this in the command line? – ceving Oct 28 '20 at 08:02
  • See https://stackoverflow.com/questions/18413014/run-a-jar-file-from-the-command-line-and-specify-classpath – Михаил Нафталь Oct 28 '20 at 09:50

1 Answers1

0

Most likely you are missing, javax.script.ScriptEngineFactory file in you project. If you look at at full example in the release notes document you linked, you will see the project has javax.script.ScriptEngineFactory file under META-INF/services/ directory.

You need similar setup in your project and content of the file will be:

org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory

this should get you going.

Dipen Shah
  • 25,562
  • 1
  • 32
  • 58