Java 在从Maven运行的测试中使用Kotlin`ScriptEngine`时获取`ScriptException`
在Maven项目中,我有一些测试正在使用KotlinJava 在从Maven运行的测试中使用Kotlin`ScriptEngine`时获取`ScriptException`,java,maven,kotlin,scriptengine,Java,Maven,Kotlin,Scriptengine,在Maven项目中,我有一些测试正在使用KotlinScriptEngine(只需调用ScriptEngine.eval(script))。当我从IntelliJ运行测试时,它们都通过了,但是在运行mvn test的过程中,我得到了以下错误: javax.script.ScriptException: Cannot access script base class 'kotlin.script.experimental.jsr223.KotlinJsr223DefaultScript'. Che
ScriptEngine
(只需调用ScriptEngine.eval(script)
)。当我从IntelliJ运行测试时,它们都通过了,但是在运行mvn test
的过程中,我得到了以下错误:
javax.script.ScriptException: Cannot access script base class 'kotlin.script.experimental.jsr223.KotlinJsr223DefaultScript'. Check your module classpath for missing or conflicting dependencies
Cannot access script provided property class 'kotlin.script.experimental.jvmhost.jsr223.KotlinJsr223ScriptEngineImpl'. Check your module classpath for missing or conflicting dependencies
Cannot access script provided property class 'org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState'. Check your module classpath for missing or conflicting dependencies
我通过适当的Maven依赖在类路径中拥有这三个类。(实际上,我在失败的测试中添加了对System.out.println(KotlinJsr223DefaultScript.class.getName())
的调用,以确保情况属实。)下面是依赖关系树的相关片段:
[INFO] | \- org.jetbrains.kotlin:kotlin-scripting-jsr223:jar:1.3.72:compile
[INFO] | +- org.jetbrains.kotlin:kotlin-script-runtime:jar:1.3.72:compile
[INFO] | +- org.jetbrains.kotlin:kotlin-scripting-common:jar:1.3.72:compile
[INFO] | | \- org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:1.2.1:compile
[INFO] | +- org.jetbrains.kotlin:kotlin-scripting-jvm:jar:1.3.72:compile
[INFO] | +- org.jetbrains.kotlin:kotlin-scripting-jvm-host:jar:1.3.72:compile
[INFO] | | \- org.jetbrains.intellij.deps:trove4j:jar:1.0.20181211:runtime
[INFO] | +- org.jetbrains.kotlin:kotlin-scripting-compiler:jar:1.3.72:compile
[INFO] | | +- org.jetbrains.kotlin:kotlin-scripting-js:jar:1.3.72:compile
[INFO] | | +- org.jetbrains.kotlin:kotlin-util-klib:jar:1.3.72:compile
[INFO] | | | \- org.jetbrains.kotlin:kotlin-util-io:jar:1.3.72:compile
[INFO] | | \- org.jetbrains.kotlin:kotlin-scripting-compiler-impl:jar:1.3.72:compile
[INFO] | +- org.jetbrains.kotlin:kotlin-compiler:jar:1.3.72:runtime
[INFO] | \- org.jetbrains.kotlin:kotlin-reflect:jar:1.3.72:runtime
我看到互联网上的人们遇到了类似的问题,但他们的解决方案是确保类在类路径上可用,我已经有了这些类。我能够让单元测试在命令行上运行。问题是surefire插件将使用只包含类路径的清单jar。出于某种原因,jar在仅清单jar中列出的顺序导致了OP上面描述的问题。通过在
pom.xml
假的
或作为Maven的命令行参数:
mvn -Dsurefire.useManifestOnlyJar=false test
有关该属性的详细信息,请参阅
mvn surefire:help -Ddetail=true
这就解决了我的问题
还有关于使用surefire加载类的文档:您能理解吗?我对Kotlin 1.4.10和1.4.21也有同样的问题。我试图用测试范围显式地添加所有依赖项,但没有任何帮助。@hanslovsky我终于能够让它工作了。我最终在测试范围中使用了这些依赖项:
org.jetbrains.kotlin:kotlin-scripting-jsr223-embeddeble:1.3.72
,org.jetbrains.kotlin:kotlin编译器embeddeble:1.3.72
,org.jetbrains.kotlin:kotlin脚本util:1.3.72
。我记得在从KotlinJsr223JvmLocalScriptEngineFactory
获取脚本引擎的实例之前,除非调用org.jetbrains.kotlin.cli.common.environment.UtilKt.setIdeaIoUseFallback()
,否则运行它会出现一些问题。感谢您提供适合您的解决方案(你可以回答并接受你自己的答案)。不幸的是,这对我不起作用。我也在使用版本1.4.21
,也许这就是问题所在。仅供参考,我在Kotlin论坛上开始了一个主题: