hey! I'm trying to use Kotlin's JSR223 Scripting A...
# scripting
l
hey! I'm trying to use Kotlin's JSR223 Scripting API for embedded DSLs in my Application. I have created the required "javax.script.ScriptEngineFactory" file in
src/main/resources/META-INF/services
, and also included the
Copy code
implementation org.jetbrains.kotlin:kotlin-script-util:$kotlinVersion"
implementation org.jetbrains.kotlin:kotlin-script-runtime:$kotlinVersion"
implementation org.jetbrains.kotlin:kotlin-compiler-embeddable:$kotlinVersion"
dependencies, and am now trying to call a simple script using
Copy code
val scriptEngine = ScriptEngineManager().getEngineByExtension("kts")!!
println(scriptEngine.eval("1+5") as Int)
but It does not execute, as i'm getting a
ClassNotFoundException: org.jetbrains.kotlin.scripting.compiler.plugin.repl.GenericReplCompiler
any ideas what causes this / how to fix it? thanks!
Some more stacktrace
Copy code
Exception in thread "main" java.lang.NoClassDefFoundError: org/jetbrains/kotlin/scripting/compiler/plugin/repl/GenericReplCompiler
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$replCompiler$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:47)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$replCompiler$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.getReplCompiler(KotlinJsr223JvmLocalScriptEngine.kt)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$localEvaluator$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:53)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$localEvaluator$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.getLocalEvaluator(KotlinJsr223JvmLocalScriptEngine.kt)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.getReplEvaluator(KotlinJsr223JvmLocalScriptEngine.kt:55)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.createState(KotlinJsr223JvmLocalScriptEngine.kt:59)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.createState$default(KotlinJsr223JvmScriptEngineBase.kt:46)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.getCurrentState(KotlinJsr223JvmScriptEngineBase.kt:53)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.nextCodeLine(KotlinJsr223JvmScriptEngineBase.kt:44)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.compileAndEval(KotlinJsr223JvmScriptEngineBase.kt:61)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.eval(KotlinJsr223JvmScriptEngineBase.kt:31)
	at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
	at MainKt.main(Main.kt:5)
	at MainKt.main(Main.kt)
Caused by: java.lang.ClassNotFoundException: org.jetbrains.kotlin.scripting.compiler.plugin.repl.GenericReplCompiler
	at <http://java.net|java.net>.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 18 more
i
Which kotlin version are you using? If your using 1.3.50 and up you need to add a few dependencies for the runtime environment.
Copy code
runtime "org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:$kotlinVersion"
  compile "org.jetbrains.kotlin:kotlin-compiler-embeddable:$kotlinVersion"
But that may look from project to project different. There are maybe better solutions, but that is what worked for me.
l
thanks! i'm using 1.3.61, and adding these dependencies did change something, and it now actually executes! Sadly, i'm now getting a huge warning:
Copy code
WARN: Failed to initialize native filesystem for Windows
java.lang.RuntimeException: Could not find installation home path. Please make sure bin/idea.properties is present in the installation directory.
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.application.PathManager.getHomePath(PathManager.java:97)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.application.PathManager.getHomePath(PathManager.java:76)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.application.PathManager.findBinFile(PathManager.java:170)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.util.loader.NativeLibraryLoader.loadPlatformLibrary(NativeLibraryLoader.java:18)
	at <http://org.jetbrains.kotlin.com.intellij.openapi.util.io|org.jetbrains.kotlin.com.intellij.openapi.util.io>.win32.IdeaWin32.<clinit>(IdeaWin32.java:47)
	at <http://org.jetbrains.kotlin.com.intellij.openapi.util.io|org.jetbrains.kotlin.com.intellij.openapi.util.io>.FileSystemUtil.getMediator(FileSystemUtil.java:51)
	at <http://org.jetbrains.kotlin.com.intellij.openapi.util.io|org.jetbrains.kotlin.com.intellij.openapi.util.io>.FileSystemUtil.<clinit>(FileSystemUtil.java:46)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ZipHandler.setFileAttributes(ZipHandler.java:62)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ZipHandler$1.createAccessor(ZipHandler.java:44)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ZipHandler$1.createAccessor(ZipHandler.java:39)
	at <http://org.jetbrains.kotlin.com.intellij.util.io|org.jetbrains.kotlin.com.intellij.util.io>.FileAccessorCache.createHandle(FileAccessorCache.java:61)
	at <http://org.jetbrains.kotlin.com.intellij.util.io|org.jetbrains.kotlin.com.intellij.util.io>.FileAccessorCache.get(FileAccessorCache.java:54)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ZipHandler.getCachedZipFileHandle(ZipHandler.java:84)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ZipHandler.acquireZipHandle(ZipHandler.java:131)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ZipHandlerBase.createEntriesMap(ZipHandlerBase.java:44)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.ArchiveHandler.getEntriesMap(ArchiveHandler.java:183)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.jar.CoreJarHandler.<init>(CoreJarHandler.java:42)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.jar.CoreJarFileSystem.lambda$new$0(CoreJarFileSystem.java:33)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.util.containers.ConcurrentFactoryMap$2.create(ConcurrentFactoryMap.java:181)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.util.containers.ConcurrentFactoryMap.get(ConcurrentFactoryMap.java:46)
	at <http://org.jetbrains.kotlin.com|org.jetbrains.kotlin.com>.intellij.openapi.vfs.impl.jar.CoreJarFileSystem.findFileByPath(CoreJarFileSystem.java:44)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment.findJarRoot(KotlinCoreEnvironment.kt:386)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment.contentRootToVirtualFile(KotlinCoreEnvironment.kt:365)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment.access$contentRootToVirtualFile(KotlinCoreEnvironment.kt:115)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$3.invoke(KotlinCoreEnvironment.kt:212)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$3.invoke(KotlinCoreEnvironment.kt:115)
	at org.jetbrains.kotlin.cli.jvm.compiler.ClasspathRootsResolver.convertClasspathRoots(ClasspathRootsResolver.kt:70)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment.<init>(KotlinCoreEnvironment.kt:219)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment.<init>(KotlinCoreEnvironment.kt:115)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$Companion.createForProduction(KotlinCoreEnvironment.kt:422)
	at org.jetbrains.kotlin.scripting.compiler.plugin.repl.GenericReplChecker.<init>(GenericReplChecker.kt:62)
	at org.jetbrains.kotlin.scripting.compiler.plugin.repl.GenericReplCompiler.<init>(GenericReplCompiler.kt:43)
	at org.jetbrains.kotlin.scripting.compiler.plugin.repl.GenericReplCompiler.<init>(GenericReplCompiler.kt:40)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$replCompiler$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:47)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$replCompiler$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.getReplCompiler(KotlinJsr223JvmLocalScriptEngine.kt)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$localEvaluator$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:53)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine$localEvaluator$2.invoke(KotlinJsr223JvmLocalScriptEngine.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.getLocalEvaluator(KotlinJsr223JvmLocalScriptEngine.kt)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.getReplEvaluator(KotlinJsr223JvmLocalScriptEngine.kt:55)
	at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine.createState(KotlinJsr223JvmLocalScriptEngine.kt:59)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.createState$default(KotlinJsr223JvmScriptEngineBase.kt:46)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.getCurrentState(KotlinJsr223JvmScriptEngineBase.kt:53)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.nextCodeLine(KotlinJsr223JvmScriptEngineBase.kt:44)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.compileAndEval(KotlinJsr223JvmScriptEngineBase.kt:61)
	at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.eval(KotlinJsr223JvmScriptEngineBase.kt:31)
	at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
	at MainKt.main(Main.kt:5)
	at MainKt.main(Main.kt)
6
any ideas?
c
your dependencies are still wrong, they conflict with each other. try with:
Copy code
implementation("org.jetbrains.kotlin:script-runtime:$kotlinVersion")
runtimeOnly("org.jetbrains.kotlin:scripting-jsr223-embeddable:$kotlinVersion")
You can look at a working example here: https://github.com/AlexCzar/kotlin-script-demo
i
I am experiencing the same problem with a dependency clash. Is there a way to resolve it ? Or to detect where the dependency clash is? The build scan seemed fine to me, but I might have missed something. I also tried it with the build settings from the example project that was linked here by @Czar and the one from the test directory in Kotlin for
KotlinJsr223JvmLocalScriptEngine
, but it throws the same error. Any help or suggestion is welcomed.