【发布时间】:2020-06-11 03:02:08
【问题描述】:
我正在尝试使用 GraalVM 版本 20.1.0 for Java 8 (graalvm-ce-java8-windows-amd64-20.1.0) 从 Java 中运行一些 ES6 JavaScript。我像这样使用Context:
try (final Context jsContext = Context.newBuilder("js").allowAllAccess(true).build()) {
final URL resource = this.getClass().getClassLoader().getResource("index.js");
final File file = Paths.get(resource.toURI()).toFile();
final Source source = Source.newBuilder("js", file).mimeType("application/javascript+module").build();
final Value value = jsContext.eval(source);
System.out.println(value);
} catch (final IOException e) {
e.printStackTrace();
} catch (final URISyntaxException e) {
e.printStackTrace();
}
我使用的 JS 文件如下所示:
// index.js
import testFn from "./testFn";
testFn; // return value to Java
// testFn.js
function testFn() {
print("Test!");
}
export default testFn;
运行这个我得到 very 无法描述的错误`
Exception in thread "main" Error: C:/path/to/testFn.js
at org.graalvm.polyglot.Context.eval(Context.java:345)
// This error points to "final Value value = jsContext.eval(source);" in the Java code
但是,如果我通过在 Java 代码中将 index.js 替换为 testFn.js 直接运行 testFn.js,它就可以正常工作!如果我删除导入它也可以正常工作,所以我认为 ES6 导入有问题。重命名文件以使用 *.mjs 扩展名没有区别。将allowIO(true) 添加到Context 配置也不会改变任何内容。
以上所有代码都是一个 MVCE,如果需要,您可以对其进行测试。
如果我也尝试导入一个不存在的文件 (import "./asdasd"),我会遇到同样的错误,所以也许只是找不到文件。虽然我已经仔细检查过该文件是否存在于它列出的目录中,所以这可能只是一个巧合。
【问题讨论】:
标签: javascript java ecmascript-6 graalvm