gpt4 book ai didi

java - 在 Java 中评估 Scala 脚本时脚本引擎出错

转载 作者:行者123 更新时间:2023-11-29 06:53:05 25 4
gpt4 key购买 nike

我有一个应用程序可以执行传递给它的 Scala 脚本。以下是我如何尝试执行 Scala 代码的示例。

String script = "println(\"Hello World!\")";
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("scala");
scriptEngine.eval(script);

我收到以下错误。

[init] error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/rt.jar(java/lang/Object.class)

Failed to initialize compiler: object scala in compiler mirror not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programmatically, settings.usejavacp.value = true.

我在 Mac 上使用 Java 7 (jdk1.7.0_80.jdk)。我在 spring-boot 应用程序中运行它。

使用了 Scala maven 依赖项。

<dependency>
<groupId>org.apache.clerezza.scala</groupId>
<artifactId>script-engine</artifactId>
<version>1.0.0</version>
</dependency>

为什么会出现此错误?

最佳答案

我们需要像这样导入和初始化脚本引擎:

import javax.script.*;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class TestScript {

public static void main(String... args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("scala");

...

使用 ScriptEngineManager().getEngineByName("scala") 可以查找匹配的脚本引擎。这只是为我们提供了引擎,而不是真正执行脚本所需的库和 Hook 。

关于 Scala 加载 JVM 所需的标准类的方式,有一点需要注意。在执行 scala 的情况下,标准 Scala 库被放置在 JVM 的类路径中。这里不会是这种情况。你可以阅读this供引用。尝试运行示例类会导致以下异常:

reflect.jar:. TestScript
[init] error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/rt.jar(java/lang/Object.class)

Failed to initialize compiler: object scala in compiler mirror not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programmatically, settings.usejavacp.value = true.
Exception in thread "main" scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found.

我们可以通过使用 scala java 工具帮助我们将标准 Scala 库加载到 JVM 类路径中来解决这个问题。这是使我们的 Scala 脚本工作的一种方法:

import javax.script.*;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

import scala.tools.nsc.interpreter.IMain;
import scala.tools.nsc.settings.MutableSettings.BooleanSetting;

public class TestScript {

public static void main(String... args) throws Exception {
....
((BooleanSetting)(((IMain)engine).settings()
.usejavacp())).value_$eq(true);

....

另一种是使用以下选项简单地执行代码:

$ java -Dscala.usejavacp=true ...

完整的脚本是这样的:

import javax.script.*;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

import scala.tools.nsc.interpreter.IMain;
import scala.tools.nsc.settings.MutableSettings.BooleanSetting;


public class TestScript {

public static void main(String... args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("scala");

((BooleanSetting)(((IMain)engine)
.settings().usejavacp()))
.value_$eq(true);

String testScript = "var a:Int = 10";
engine.eval(testScript);

String testScript2 = "println(a)";
engine.eval(testScript2);

String testScript3 = "println(a+5)";
engine.eval(testScript3);
}
}

编译和运行它非常简单,因为我们需要类路径中的 Scala 库。

编译:

$ javac -cp /Users//hkropp/bin/scala-2.11.7/lib/scala-library.jar:\
/Users//hkropp/bin/scala-2.11.7/lib/scala-compiler.jar:\
/Users//hkropp/bin/scala-2.11.7/lib/scala-reflect.jar \
TestScript.java

运行:

$ java -Dscala.usejavacp=true \-cp /Users//hkropp/bin/scala-2.11.7/lib/scala-library.jar:\
/Users//hkropp/bin/scala-2.11.7/lib/scala-compiler.jar:\
/Users//hkropp/bin/scala-2.11.7/lib/scala-reflect.jar:. \
TestScript
10
15

关于java - 在 Java 中评估 Scala 脚本时脚本引擎出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41130824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com