Не удалось создать экземпляр GraalJSEngineFactory

#java #java-11 #graalvm #graaljs

#java #java-11 #graalvm #graaljs

Вопрос:

Я новичок в Graal. Я ссылаюсь на этот документ. Я использую JDK 11.

Ниже приведен код, который я пытаюсь запустить:

 ScriptEngine graaljsEngine = new ScriptEngineManager().getEngineByName("graal.js");
if (graaljsEngine == null) 
{
    System.out.println("Graal.js not found");
    return null;
}
try 
{
    System.out.println(graaljsEngine.eval("IncomingMessageString"));
} 
catch (ScriptException e) 
{
    e.printStackTrace();
}
  

используются банки:

 1: truffle-api-20.2.0.jar    
2: js-scriptengine-20.2.0.jar    
3: js-20.2.0.jar    
4: graal-sdk-20.2.0.jar    
5: compiler-20.2.0.jar
  

При попытке выполнить приведенный выше код я сталкиваюсь со следующей ошибкой:

ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.oracle.truffle.js.scriptengine.Не удалось создать экземпляр GraalJSEngineFactory

Я попытался запустить код со следующими параметрами виртуальной машины:

 -Dpolyglot.inspect.Secure=false
  

это все еще не решает проблему.

Ответ №1:

Наконец, пришлось использовать автоматизацию сборки, и это заставило ее работать, что странно, поскольку я не упоминаю никаких новых jar, кроме тех, которые я уже добавил вручную.

Если вы используете gradle, поместите это в свой build.gradle, и все в порядке:

 dependencies {
    compile group: 'org.graalvm.js', name: 'js', version: '20.2.0'
    compile group: 'org.graalvm.js', name: 'js-scriptengine', version: '20.2.0'
    compile group: 'org.graalvm.sdk', name: 'graal-sdk', version: '20.2.0'
    compile group: 'org.graalvm.truffle', name: 'truffle-api', version: '20.2.0'
}
  

Если вы используете maven, поместите это в свой build.gradle, и ваши данные хороши:

     <properties>
        <graalvm.version>20.2.0</graalvm.version>
        <compiler.dir>${project.build.directory}/compiler</compiler.dir>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.graalvm.sdk</groupId>
            <artifactId>graal-sdk</artifactId>
            <version>${graalvm.version}</version>
        </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>
        </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>
  

Я уверен, что эти инструменты автоматизации сборки решают проблему, получая другие недостающие банки. Я нашел эту ссылку полезной: http://www.mosgrom.net/stuff/graalvm.html но, как я уже сказал, простое добавление необходимых jar вручную путем распаковки двоичного файла сообщества graalvm или из репозитория maven в мой java-проект не решило проблему, если я не использовал maven / gradle для управления зависимостями. Надеюсь, это поможет кому-нибудь еще с такой же проблемой :).

Ответ №2:

Самое простое и эффективное решение — запустить ваш код в дистрибутиве GraalVM: просто измените JAVA_HOME путь к GraalVM или измените настройки Java home в вашей IDE.

Если вы настаиваете на использовании другого дистрибутива JDK, то взгляните на https://www.graalvm.org/reference-manual/js/RunOnJDK /