【问题标题】:com.oracle.truffle.polyglot.PolyglotImpl (in unnamed module) cannot access class org.graalvm.polyglot.impl.AbstractPolyglotImplcom.oracle.truffle.polyglot.PolyglotImpl(在未命名的模块中)无法访问类 org.graalvm.polyglot.impl.AbstractPolyglotImpl
【发布时间】:2020-10-12 15:58:35
【问题描述】:

我尝试使用 GraalVM 的多语言代码扩展脚手架式 quarkus 演示 https://code.quarkus.io/

@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
    String out = "From JS:";
    try (Context context = Context.create()) {
        Value function = context.eval("js", "x => x+1");
        assert function.canExecute();
        int x = function.execute(41).asInt();
        out=out+x;
        System.out.println(out);
    }
    return "hello";
}

我按照此处的建议向 pom.xml 添加了依赖项 [https://stackoverflow.com/questions/54384499/illegalstateexception-no-language-and-polyglot-implementation-was-found-on-the]

<dependency>
  <groupId>org.graalvm.js</groupId>
  <artifactId>js</artifactId>
  <version>20.1.0</version>
</dependency>
<dependency>
  <groupId>org.graalvm.js</groupId>
  <artifactId>js-scriptengine</artifactId>
  <version>20.1.0</version>
</dependency>
<dependency>
  <groupId>org.graalvm.truffle</groupId>
  <artifactId>truffle-api</artifactId>
  <version>20.1.0</version>
</dependency>

但是当我在命令行上运行时

./mvnw clean package

测试因异常而失败,我不明白。

2020-06-22 19:26:56,328 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] 
(executor-thread-1) HTTP Request to /hello failed, error id: 996b0479-d836-47a5-bbcb-67bd876f9277-1: org.jboss.resteasy.spi.UnhandledException: 
java.lang.IllegalAccessError: superclass access check failed: 
class com.oracle.truffle.polyglot.PolyglotImpl (in unnamed module @0x7bf61ba2) cannot access class org.graalvm.polyglot.impl.AbstractPolyglotImpl (in module org.graalvm.sdk) 
because module org.graalvm.sdk does not export org.graalvm.polyglot.impl to unnamed module @0x7bf61ba2

更新:

看起来像是 quarkus 中的回归,https://github.com/quarkusio/quarkus/issues/10226。 与 quarkus 1.2.1(而不是 1.5.2)一起使用时,应用程序测试通过。

【问题讨论】:

标签: quarkus graalvm polyglot


【解决方案1】:

查看mvn dependency:tree -- 原来org.graalvm.js:js:20.1.0 依赖于org.graalvm.sdk:graal-sdk:19.3.1。我个人称之为 GraalVM JS 错误。

如果您添加对 org.graalvm.sdk:graal-sdk:20.1.0 的显式依赖,它应该可以工作。

(至少它对我有用,但我得到的错误与你不同,所以不确定。)

编辑:正如我在评论中被警告的那样,org.graalvm.js:js:20.1.0 依赖于org.graalvm.sdk:graal-sdk:19.3.1正确的。相反,一定有其他东西将graal-sdk 强制到19.3.1,也许是来自 Quarkus 的东西。将其显式管理到 20.1.0 应该仍然有帮助。

【讨论】:

  • 我不认为这是正确的。根据search.maven.org/artifact/org.graalvm.js/js/20.1.0/jar,Graal.js JAR 对org.graalvm.sdk:graal-sdk:20.1.0 有这种静态依赖。您是否可以在 GraalVM 19.3.1 上运行并使用 Graal.js 20.1.0 JAR 文件?这可能会使系统感到困惑——要么使用 GraalVM(已经随 Graal.js 提供),要么在 Stock JDK + Maven 依赖项上运行。
  • 是的,一定是其他东西将graal-sdk 强制转换为19.3.1,也许是来自 Quarkus 的东西。我对mvn dependency:tree 输出的形状感到困惑,我将在答案中添加注释。我仍然认为将graal-sdk 明确管理到所需版本的建议是正确的。
  • 嗨,我们再次这样做 - 存在依赖关系。如果有什么东西覆盖了这一点,我认为这超出了我们的控制范围。
  • 当我说“我仍然认为将 graal-sdk 显式管理为所需版本的建议是正确的”时,我的意思是在记者提供的复制器项目的上下文中。因为我实际上查看了该项目的mvn dependency:tree 输出,并尝试显式管理graal-sdk 版本,它有所帮助。
  • mvn dependency:tree 报告的org.graalvm.sdk:graal-sdk:jar:19.3.1:compile 存在依赖关系:[INFO] +- org.graalvm.js:js:jar:20.1.0:compile [INFO] | +- org.graalvm.regex:regex:jar:20.1.0:compile [INFO] | +- org.graalvm.sdk:graal-sdk:jar:19.3.1:compile 按照 Ladicek 的建议将依赖关系:&lt;groupId&gt;org.graalvm.sdk&lt;/groupId&gt;&lt;artifactId&gt;graal-sdk&lt;/artifactId&gt;&lt;version&gt;20.1.0&lt;/version&gt; 添加到 pom.xml 后,不再依赖于 19.3.1已报告,但异常仍然存在。
【解决方案2】:

您是否可能在 GraalVM 19.3.1 上执行该操作?众所周知,这会混淆系统。我们强烈建议要么在 GraalVM 上运行(它会自动包含适当版本​​的 Graal.js,无需进一步输入),要么在 Stock JDK 上运行并从 Maven 导入相应的 JAR。如果您在 GraalVM 上从 maven 导入(不同版本的)我们的 Jars,那么您可能会遇到类似的冲突。

【讨论】:

  • io.quarkus:quarkus-core:jar:1.5.2.Final:compile 带来了对org.graalvm.sdk:graal-sdk:jar:19.3.1:compile 的依赖。它可以在为刚刚搭建的 quarkus 项目生成的依赖树中看到(即使用 pom.xml 而不依赖于 org.graalvm.js:jsorg.graalvm.js:js-scriptengineorg.graalvm.truffle:truffle-api
猜你喜欢
  • 2019-05-07
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多