GraalVM:主机环境不允许访问本机代码
GraalVM: Access to native code is not allowed by the host environment
我最近设置了一个 Centos7 虚拟机来玩转 GraalVM。我下载了graalvm-1.0.0-rc1,安装了Netbeans8.2,下载了FastR扩展(via 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 文件在那里并且可用。我已将其定义为 运行 参数(尽管我不需要)。
我找不到关于显示 "access to native code is not allowed by the host environment" 的原因并且不知所措。关于我做错了什么的任何想法?注意:我还用 python 和 ruby 尝试了相同的测试,得到了相同的结果,但删除了最简单的测试用例。
这是使用 GraalVM 多语言 API 创建的多语言上下文的安全功能。默认情况下,每种语言都与宿主环境隔离,因此不允许访问 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/
我最近设置了一个 Centos7 虚拟机来玩转 GraalVM。我下载了graalvm-1.0.0-rc1,安装了Netbeans8.2,下载了FastR扩展(via 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 文件在那里并且可用。我已将其定义为 运行 参数(尽管我不需要)。
我找不到关于显示 "access to native code is not allowed by the host environment" 的原因并且不知所措。关于我做错了什么的任何想法?注意:我还用 python 和 ruby 尝试了相同的测试,得到了相同的结果,但删除了最简单的测试用例。
这是使用 GraalVM 多语言 API 创建的多语言上下文的安全功能。默认情况下,每种语言都与宿主环境隔离,因此不允许访问 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/