首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GraalVM -在类路径上没有语言和多标记实现。

GraalVM -在类路径上没有语言和多标记实现。
EN

Stack Overflow用户
提问于 2019-06-22 02:36:19
回答 1查看 3.2K关注 0票数 5

我试图在项目中使用GraalVM来添加简单的脚本功能。我使用Maven进行依赖关系管理来加载Graal的基本依赖项。这是我的pom.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cx.matthew</groupId>
  <artifactId>graaltest</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <graalvm.version>19.0.2</graalvm.version>
    <compiler.dir>${project.build.directory}/compiler</compiler.dir>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
  </properties>

  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
    <repository>
      <id>papermc</id>
      <url>https://papermc.io/repo/repository/maven-public/</url>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>org.graalvm.sdk</groupId>
      <artifactId>graal-sdk</artifactId>
      <version>${graalvm.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js</artifactId>
      <version>${graalvm.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js-scriptengine</artifactId>
      <version>${graalvm.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.graalvm.tools</groupId>
      <artifactId>profiler</artifactId>
      <version>${graalvm.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.graalvm.tools</groupId>
      <artifactId>chromeinspector</artifactId>
      <version>${graalvm.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.graalvm.truffle</groupId>
      <artifactId>truffle-api</artifactId>
      <version>19.0.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.destroystokyo.paper</groupId>
      <artifactId>paper-api</artifactId>
      <version>1.14.2-R0.1-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

下面是我调用Graal的代码:

代码语言:javascript
运行
复制
package cx.matthew.graaltest;

import org.bukkit.plugin.java.JavaPlugin;
import org.graalvm.polyglot.Context;

public class GraalTestPlugin extends JavaPlugin {

  @Override
  public void onEnable() {
    Context context = Context.create();
    context.eval("js", "console.log(\"hi!!!\");");
  }

}

虽然据我所知,这应该是可行的,但在运行它时,它会输出以下错误:

代码语言:javascript
运行
复制
[19:25:16 ERROR]: Error occurred while enabling GraalTest v1.0-SNAPSHOT (Is it up to date?)
java.lang.IllegalStateException: No language and polyglot implementation was found on the classpath. Make sure the truffle-api.jar is on the classpath.
    at org.graalvm.polyglot.Engine$PolyglotInvalid.noPolyglotImplementationFound(Engine.java:800) ~[?:?]
    at org.graalvm.polyglot.Engine$PolyglotInvalid.buildEngine(Engine.java:732) ~[?:?]
    at org.graalvm.polyglot.Engine$Builder.build(Engine.java:505) ~[?:?]
    at org.graalvm.polyglot.Context$Builder.build(Context.java:1304) ~[?:?]
    at org.graalvm.polyglot.Context.create(Context.java:697) ~[?:?]
    at cx.matthew.graaltest.GraalTestPlugin.onEnable(GraalTestPlugin.java:10) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:338) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:419) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.enablePlugin(CraftServer.java:464) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.enablePlugins(CraftServer.java:378) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.reload(CraftServer.java:854) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.Bukkit.reload(Bukkit.java:610) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:54) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.dispatchCommand(CraftServer.java:736) ~[patched_1.14.2.jar:git-Paper-97]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.dispatchServerCommand(CraftServer.java:698) ~[patched_1.14.2.jar:git-Paper-97]
    at net.minecraft.server.v1_14_R1.DedicatedServer.handleCommandQueue(DedicatedServer.java:457) ~[patched_1.14.2.jar:git-Paper-97]
    at net.minecraft.server.v1_14_R1.DedicatedServer.b(DedicatedServer.java:419) ~[patched_1.14.2.jar:git-Paper-97]
    at net.minecraft.server.v1_14_R1.MinecraftServer.a(MinecraftServer.java:1061) ~[patched_1.14.2.jar:git-Paper-97]
    at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:905) ~[patched_1.14.2.jar:git-Paper-97]
    at java.lang.Thread.run(Thread.java:834) [?:?]

当然,正如错误描述的那样,建议的解决方案是将块菌api.jar包含在类路径中,但是,由于这是在插件环境中运行的,因此让这个插件的最终用户手动设置类路径并不理想。松露-api Maven依赖项中的阴影似乎不起作用,这通常是解决此类问题的方法。

已经提出了一些现有的解决办法。我遇到的第一个例子是在这个答案中,但是正如您在我的pom.xml中看到的那样,所有这些依赖项都已经包括在内。

我看到的另一个解决方案(以及问题)是在这个GitHub问题中概述的,但是虽然我可以确认修改后的META/块菌/语言文件在我的最后一个jar中,但它似乎不起作用。这是jar中输出的文件:

代码语言:javascript
运行
复制
language1.characterMimeType.0=application/tregex
language1.className=com.oracle.truffle.regex.RegexLanguage
language1.id=regex
language1.implementationName=
language1.interactive=false
language1.internal=true
language1.name=REGEX
language1.version=0.1

language2.characterMimeType.0=application/javascript
language2.characterMimeType.1=application/javascript+module
language2.characterMimeType.2=text/javascript
language2.className=com.oracle.truffle.js.lang.JavaScriptLanguage
language2.defaultMimeType=application/javascript
language2.dependentLanguage.0=regex
language2.fileTypeDetector0=com.oracle.truffle.js.lang.JSFileTypeDetector
language2.id=js
language2.implementationName=GraalVM JavaScript
language2.interactive=true
language2.internal=false
language2.name=JavaScript
language2.version=inherit

所以,我现在有点不知所措。有没有人对如何解决这个问题有任何想法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-23 00:03:34

到目前为止,我找到的最佳解决方法是将上下文ClassLoader替换为正确的上下文,然后将其交换回来:

代码语言:javascript
运行
复制
ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
// Insert Graal code here
Thread.currentThread().setContextClassLoader(oldCl);

您甚至可以将其设置为回调,这样就不必重复使用相同的代码了:

代码语言:javascript
运行
复制
private void runInPluginContext(ContextCallback callback) {
  ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
  callback.call();
  Thread.currentThread().setContextClassLoader(oldCl);
}

interface ContextCallback {

  void call();

}

并使用以下方法运行:

代码语言:javascript
运行
复制
runInPluginContext(() -> {
  // Insert Graal code here
});

显然,这并不理想,因为每次调用Graal代码时都需要更改上下文。如果有人有更好的解决方案,我很乐意看到!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56712178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档