Java 在从Maven运行的测试中使用Kotlin`ScriptEngine`时获取`ScriptException`

Java 在从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

在Maven项目中,我有一些测试正在使用Kotlin
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论坛上开始了一个主题: