Как определить, была ли обновлена ​​JVM без перезагрузки (в Windows)? - PullRequest
4 голосов
/ 04 ноября 2010

Мы часто получаем следующую трассировку стека от наших пользователей Windows:

java.lang.UnsatisfiedLinkError: sun.awt.image.ImageRepresentation.setBytePixels(IIII[BIILsun/awt/image/ByteComponentRaster;I)V
    at sun.awt.image.ImageRepresentation.setBytePixels(Native Method)
    at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
    at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
    at sun.awt.image.GifImageDecoder.sendPixels(Unknown Source)
    at sun.awt.image.GifImageDecoder.parseImage(Native Method)
    at sun.awt.image.GifImageDecoder.readImage(Unknown Source)
    at sun.awt.image.GifImageDecoder.produceImage(Unknown Source)
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at sun.awt.image.ImageFetcher.run(Unknown Source)

Это происходит, когда пользователь обновил Java, а затем пытается запустить наше приложение без перезагрузки. Очевидно, что для обновления Java (как и всего остального в Windows) требуется перезагрузить компьютер, чтобы вернуть его в рабочее состояние.

Это не исключение, которое мы можем поймать, поскольку ни один из нашего кода не находится в стеке вызовов. Мы можем обработать исключение из Thread.UncaughtExceptionHandler, что мы и делаем сейчас.

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

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Боюсь, вам не повезло.Там может быть запись в реестре, чтобы ОС знала, что она нуждается в перезагрузке, но это устанавливается только тогда, когда этого требует установщик.Единственное другое исключение - если есть код, использующий DLL, который в противном случае был бы заменен установщиком.Процесс установки вызовет диалоговое окно «Требуется перезагрузка для завершения» из ОС.

Мне еще нужно автоматическое обновление Java, требующее перезагрузки компьютера.Если ОС никогда не находится в состоянии «требуется перезагрузка», вам нечего найти и проверить.Лучшее, что вы можете сделать, это перехватить исключение и отобразить красивое сообщение об ошибке.Я бы сообщил об этой проблеме как об ошибке в Oracle (человек, к которому будет трудно привыкнуть).Возможно, будущие обновления будут вести себя правильно.

0 голосов
/ 05 ноября 2010

Если у вас есть гарантия вызова некоторого кода до того, как произойдет исключение, я бы посоветовал рассмотреть возможность ручной проверки версии Java.Вы никогда не знаете, могло ли последнее обновление вызвать такой сбой, но вы всегда можете проверить, изменилась ли версия Java с момента последнего выполнения.Давайте сохраним это где-нибудь простым способом.

Затем, при каждом запуске, если версия Java изменялась, вы отображали информацию: «Java обновлена, и мое приложение может работать некорректно.Рекомендуется перезагрузка и / или прекращение продолжения.

Что-то вроде:

public static void main(String[] argv) {
  String lastJVM = retrieveJVMversionFromLastExecution();
  String currentJVM = System.getProperty("java.version");
  if (!currentJVM.equals(lastJVM)) {
     throw new RuntimeException("New JVM. Please reboot");
  }  else {
     storeJVMversionPersistently(currentJVM);
  }     

  // ... your normal operation

}
...