Как вы можете определить, работает ли ваша 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
Другие вопросы по тегам