如何判断您的Java程序是否在GraalVM AOT上下文中运行?

时间:2018-05-10 02:28:13

标签: graalvm

我有一个小程序。我使用Graal的native-image(即GraalVM AOT aka SubstrateVM)构建二进制文件。

我的程序可以使用Java运行时执行,也可以使用native-image二进制文件执行。什么是告诉我正在运行的上下文的最佳方式?

(这可能是一种不好的做法,但我认为在某些非常罕见的情况下这是不可避免的/必要的。)

2 个答案:

答案 0 :(得分:2)

GraalVM现在提供了API来检查AOT上下文:

ImageInfo.inImageCode()
ImageInfo.inImageRuntimeCode()
ImageInfo.inImageBuildtimeCode()
ImageInfo.isExecutable()
ImageInfo.isSharedLibrary()

答案 1 :(得分:0)

我倾向于检查某些系统属性的存在/不存在。当我在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系统属性的SO:

What is the full list of standard keys recognized by the Java System.getProperty() method?

因此,一种方法是检查是否缺少一个或多个java.*属性。

AFAIK没有计划在SubstrateVM中设置这些。但系统属性是可变的,因此可以选择伪造它们。

但无论如何,这是一种方法:

def isGraalAOT = System.properties.getProperty("java.class.path") == null