Как вы можете определить, работает ли ваша Java-программа в контексте AOT GraalVM?
У меня есть небольшая программа на Java. Я строю двоичный файл, используя Graal's native-image
(т.е. GraalVM AOT aka SubstrateVM).
Моя программа может быть выполнена либо с помощью среды выполнения Java, либо из двоичного файла собственного изображения. Как лучше всего определить, в каком контексте я работаю?
(Это может быть плохой практикой в целом, но я считаю, что это неизбежно / необходимо в определенных не редких обстоятельствах.)
3 ответа
Изменить: теперь есть API для этого. См. User7983712 ответ.
В GraalVM это делается путем захвата com.oracle.graalvm.isaot
системное свойство: оно установлено в true
во время построения изображений AOT. Если вы объедините это с тем фактом, что статические инициализаторы работают во время генерации изображения, вы можете использовать
static final boolean IS_AOT = Boolean.getBoolean("com.oracle.graalvm.isaot")
Это логическое значение останется верным при запуске собственного образа.
Это также полезно для обрезки путей, которые вам не нужны в конечном выводе: например, если у вас есть код, который использует функцию, которую не поддерживает SVM (например, динамическая загрузка классов), вы можете предсказать ее с помощью !IS_AOT
,
GraalVM теперь предоставляет API для проверки контекста AOT:
ImageInfo.inImageCode()
ImageInfo.inImageRuntimeCode()
ImageInfo.inImageBuildtimeCode()
ImageInfo.isExecutable()
ImageInfo.isSharedLibrary()
Я склоняюсь к проверке наличия / отсутствия некоторых системных свойств. Когда я распечатываю системные свойства под 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 и вместо ссылки на другой SO перечислю обычные свойства Java System:
Каков полный список стандартных ключей, распознаваемых методом Java System.getProperty()?
Так что один из способов сделать это - проверить, является ли один или несколько java.*
свойства отсутствуют.
AFAIK нет никаких планов установить их в SubstrateVM. Но системные свойства изменчивы, так что можно было бы подделать их.
Но в любом случае вот способ сделать это:
def isGraalAOT = System.properties.getProperty("java.class.path") == null