即使包和类有效,Kotlin Script Engine也会抛出未解析的引用"

时间:2018-06-12 15:32:47

标签: kotlin

使用Kotlin的脚本引擎时,尝试导入包或使用任何类都会引发一个未解析的引用"

javax.script.ScriptException: error: unresolved reference: mrpowergamerbr
fun loritta(context: com.mrpowergamerbr.loritta.commands.CommandContext) {
                         ^

在IntelliJ IDEA中运行类时不会发生这种情况,但是在生产中运行类时会发生这种情况。

1 个答案:

答案 0 :(得分:2)

虽然这个YouTrack issue与胖JAR有关,但如果你没有使用胖JAR(通过启动类路径选项或类路径清单选项加载所有库),也会发生这种情况。 p>

要解决此问题,或者您可以在启动脚本中依赖以下所有依赖项:

-Dkotlin.script.classpath=jar1:jar2:jar3:jar4

示例:

java -Dkotlin.script.classpath=libs/dependency1.jar:libs/dependency2.jar:yourjar.jar -jar yourjar.jar

或者,如果您愿意,可以使用Class-Path清单选项通过代码设置属性。

val path = this::class.java.protectionDomain.codeSource.location.path
val jar = JarFile(path)
val mf = jar.manifest
val mattr = mf.mainAttributes
// Yes, you SHOULD USE Attributes.Name.CLASS_PATH! Don't try using "Class-Path", it won't work!
val manifestClassPath = mattr[Attributes.Name.CLASS_PATH] as String

// The format within the Class-Path attribute is different than the one expected by the property, so let's fix it!
// By the way, don't forget to append your original JAR at the end of the string!
val propClassPath = manifestClassPath.replace(" ", ":") + ":Loritta-0.0.1-SNAPSHOT.jar"

// Now we set it to our own classpath
System.setProperty("kotlin.script.classpath", propClassPath)

虽然我还没有对此进行测试,但在另一个不相关的答案中,如果您自己初始化KotlinJsr223JvmLocalScriptEngine对象(如here所示),您似乎也可以提供自己的类路径