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

Getting `ScriptException` when using Kotlin `ScriptEngine` in tests run from Maven

在 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 插件将使用包含 class 路径的仅清单 jar。出于某种原因,罐子在仅清单罐子中列出的顺序导致了 OP 上面描述的问题。我能够通过在 pom.xml

中设置 surefire.useManifestOnlyJar=false 来解决这个问题
<properties>
    <surefire.useManifestOnlyJar>false</surefire.useManifestOnlyJar>
</properties>

或作为 Maven 的命令行参数:

mvn -Dsurefire.useManifestOnlyJar=false test

有关 属性 的更多详细信息,请参阅

mvn surefire:help -Ddetail=true

这解决了我的问题。

还有关于 class 使用 surefire 加载的文档:https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html