我有一个Java程序。我使用Graal的native-image
(即GraalVM AOT,又名SubstrateVM)构建一个二进制文件。
我的程序可以使用Java运行时执行,也可以从本机映像二进制文件执行。知道我在哪个上下文中运行的最佳方法是什么?
(一般来说,这可能是一种糟糕的做法,但我认为,在某些并非罕见的情况下,这是不可避免的/必要的。)
发布于 2018-11-18 17:56:46
GraalVM现在提供了一个API接口,用于检查AOT上下文:
ImageInfo.inImageCode()
ImageInfo.inImageRuntimeCode()
ImageInfo.inImageBuildtimeCode()
ImageInfo.isExecutable()
ImageInfo.isSharedLibrary()
发布于 2018-05-11 03:53:21
编辑:现在有了一个API。见answer 7983712的答案。
它在GraalVM中的实现方式是捕获com.oracle.graalvm.isaot
系统属性:在构建com.oracle.graalvm.isaot
映像时将其设置为true
。如果将此与静态初始化器在图像生成过程中运行的事实相结合,则可以使用
static final boolean IS_AOT = Boolean.getBoolean("com.oracle.graalvm.isaot")
在运行本机映像时,此布尔值将保持为真。
这对于切断最终输出中不想要的路径也很有用:例如,如果您有一些代码使用支持向量机不支持的特性(例如,动态类加载),则可以使用!IS_AOT
对其进行谓词。
发布于 2018-05-09 18:28:12
我倾向于检查某些系统属性的存在/缺失。当我在Graal AOT下打印系统属性时,我会看到:
{os.arch=x86_64, file.encoding=UTF-8, user.home=/Users/thom, path.separator=:, os.name=Mac OS X, user.dir=/Users/thom, line.separator=
, sun.jnu.encoding=UTF-8, file.separator=/, java.io.tmpdir=/var/folders/0x/rms5rjn526x33rm394xwmr8c0000gn/T/, user.name=thom}
您可能会注意到,它相当短,并且缺少了所有常见的java.*
,例如java.class.path
。我将省略列出冗长的Java版本,而是链接到另一个版本,从而列出通常的Java系统属性:
Java System.getProperty()方法所识别的标准键的完整列表是什么?
因此,一种方法似乎是检查是否缺少一个或多个java.*
属性。
AFAIK没有在SubstrateVM中设置这些的计划。但是系统属性是可变的,所以人们可以选择伪造它们。
但不管怎样,有个方法可以做到:
def isGraalAOT = System.properties.getProperty("java.class.path") == null
https://stackoverflow.com/questions/50264604
复制相似问题