Как вы можете определить, работает ли ваша Java-программа в контексте AOT GraalVM? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть небольшая программа на Java. Я создаю двоичный файл, используя Graal's native-image (то есть GraalVM AOT или SubstrateVM).

Моя программа может выполняться либо с помощью среды выполнения Java, либо из двоичного файла собственного изображения. Как лучше всего определить, в каком контексте я работаю?

(В общем, это может быть плохой практикой, но я считаю, что это неизбежно / необходимо при определенных не редких обстоятельствах.)

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Edit: теперь есть API для этого. См. User7983712 ответ.

Способ, которым это делается в GraalVM, заключается в захвате системного свойства com.oracle.graalvm.isaot: оно устанавливается на true при построении изображений AOT. Если вы сочетаете это с тем фактом, что статические инициализаторы работают во время генерации изображения, вы можете использовать

static final boolean IS_AOT = Boolean.getBoolean("com.oracle.graalvm.isaot")

Это логическое значение останется верным при запуске собственного образа.

Это также полезно для обрезки путей, которые вам не нужны в конечном выводе: например, если у вас есть код, который использует функцию, которая не поддерживается SVM (например, динамическая загрузка классов), вы можете предикат это с !IS_AOT.

0 голосов
/ 19 ноября 2018

GraalVM теперь предоставляет API для проверки контекста AOT:

ImageInfo.inImageCode()
ImageInfo.inImageRuntimeCode()
ImageInfo.inImageBuildtimeCode()
ImageInfo.isExecutable()
ImageInfo.isSharedLibrary()
0 голосов
/ 10 мая 2018

Я склоняюсь к проверке наличия / отсутствия некоторых системных свойств. Когда я распечатываю системные свойства в 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
...