首页 > 解决方案 > GraalVM:允许外部脚本访问本机编译对象

问题描述

我正在创建一个 java/groovy 应用程序,它还支持通过 groovy 编写脚本。有很多遗留的 Java 代码和用 Groovy 编写的新部分。除此之外,该应用程序还可以使用 groovy 编写脚本。

我可以让所有东西都在 VM 下运行,并像过去一样混淆 jar 中的符号 - 没问题。但:

我正在评估使用 GraalVM 创建本机二进制文件,但问题是它如何与在运行时运行外部 groovy 脚本兼容?graal 是否保留类和方法的符号信息,以及方法调用的数据交换如何从脚本处理到本机?我不确定这是否会奏效。

从过去的类似项目中,我知道在大多数情况下,本机编译会去除任何符号的二进制文件。我还需要这个功能来代替混淆。计划是为某些方法和对象保留符号,这些符号只允许由外部 groovy 脚本访问。

澄清:这尤其与 GroovyScriptEngine 和 CroovyClassLoader 有关。此处为第 1.3 和 1.4 节。

与 groovy VM 相比,GraalVM 的内存模型如何编译 groovy?如果我在运行时加载一个类并将一个从本机端创建的对象 foo 传递给它,那么脚本是否可以正常工作并能够正常使用成员,甚至可以对 foo 进行反射?

谢谢您的帮助。

标签: javagroovycompilationgraalvm

解决方案


@Boris 是正确的,groovy 在所有脚本运行时编译中内部使用 java 类加载器。没有 JVM,Graal 的 native/Substrate VM 版本无法运行新生成的 JVM butecode。


推荐阅读