我有一个小程序。我使用Graal的native-image
(即GraalVM AOT aka SubstrateVM)构建二进制文件。
我的程序可以使用Java运行时执行,也可以使用native-image二进制文件执行。什么是告诉我正在运行的上下文的最佳方式?
(这可能是一种不好的做法,但我认为在某些非常罕见的情况下这是不可避免的/必要的。)
答案 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