GraalVM: доступ к нативному коду не разрешен хост-средой - PullRequest
0 голосов
/ 25 апреля 2018

Я только недавно настроил виртуальную машину Centos7 для работы с GraalVM.Я скачал graalvm-1.0.0-rc1, установил Netbeans8.2 и скачал расширение FastR (через gu).Затем я написал простую Java-программу для тестирования некоторых из поддерживаемых языков.Ниже приведен код, который я написал:

package javatest;

import org.graalvm.polyglot.*;
import java.io.PrintStream;
import java.util.Set;

public class JavaTest {

public static void main(String[] args) {

    PrintStream output = System.out;
    Context context = Context.create();
    Set<String> languages = context.getEngine().getLanguages().keySet();
    output.println("Current Languages available in GraalVM: " + languages);

    // TODO code application logic here
    System.out.println("Java: Hello World");

    context.eval("js","print('JavaScript: Hello World')");
    context.eval("R", "print('R: Hello World');");
  }
}

Вывод выглядит следующим образом:

run:
Current Languages available in GraalVM: [R, js, llvm]
Java: Hello World
JavaScript: Hello World
FastR unexpected failure: error loading libR from: /usr/local/graalvm-1.0.0- 
    rc1/jre/languages/R/lib/libR.so.
If running on NFI backend, did you provide location of libtrufflenfi.so as 
value of system property 'truffle.nfi.library'?
The current value is '/usr/local/graalvm-1.0.0- 
    rc1/jre/lib/amd64/libtrufflenfi.so'. 
Details: Access to native code is not allowed by the host environment.
Exception in thread "main" org.graalvm.polyglot.PolyglotException
   at org.graalvm.polyglot.Context.eval(Context.java:336)
   at javatest.JavaTest.main(JavaTest.java:32)

Как вы можете видеть при первоначальном вызове для просмотра поддерживаемых языков, он распознает, что R установлен, нокак только я называю eval на языке, который он выбивает.Файл trufflenfi.so есть и доступен.Я определил его как параметр запуска (хотя мне это и не нужно).

Я не могу найти ничего о том, почему «доступ к собственному коду не разрешен средой хоста» отображается, и я в растерянности.Есть идеи, что я делаю не так?Примечание: я также попробовал тот же тест с python и ruby ​​и получил тот же результат, но был удален для простейших тестовых случаев.

1 Ответ

0 голосов
/ 26 апреля 2018

Это функция безопасности контекстов полиглотов, созданных с помощью API полиглотов GraalVM.По умолчанию каждый язык изолирован от среды хоста, поэтому запрещено использовать классы Java, собственный доступ или файлы в вашей файловой системе.В настоящее время в GraalVM 1.0.0-RC1 языки Ruby и R нуждаются в собственном доступе для загрузки своей среды.Языки JavaScript и Python не нуждаются в собственном доступе к загрузке.

Если вы хотите создать контекст со всеми правами доступа, вы можете создать контекст следующим образом:

Context.newBuilder().allowAllAccess(true).build();

Вы также можетепросто выборочно разрешить доступ к собственному коду:

Context.newBuilder().allowNativeAccess(true).build();

Вот ваш пример исправления:

package javatest;

import org.graalvm.polyglot.*;
import java.io.PrintStream;
import java.util.Set;

public class JavaTest {

public static void main(String[] args) {

    PrintStream output = System.out;
    Context context = Context.newBuilder().allowAllAccess(true).build();
    Set<String> languages = context.getEngine().getLanguages().keySet();
    output.println("Current Languages available in GraalVM: " + languages);

    // TODO code application logic here
    System.out.println("Java: Hello World");

    context.eval("js","print('JavaScript: Hello World')");
    context.eval("R", "print('R: Hello World');");
  }
}

Вот еще несколько примеров, которые используют весь доступ для Ruby и R: http://www.graalvm.org/docs/graalvm-as-a-platform/embed/

...