Как предотвратить NoClassDefFoundError, когда среда выполнения Java находится на съемном диске? - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть приложение Java на USB-накопителе вместе с JRE (по одному для каждой Windows, Mac OSX и Linux), чтобы его можно было запустить в любой системе, даже если Java не установлена. У меня запущен поток, чтобы определить, удалена ли флешка и выходит ли она из приложения.

Я хочу, чтобы он отображал сообщение перед выходом (или сказал им переустановить диск), но если я пытаюсь отобразить JOptionPane, я получаю NoClassDefFoundError, потому что JRE был удален вместе с USB.

Есть ли способ сохранить необходимые классы в памяти, чтобы Java не пыталась загрузить их из файловой системы, которой больше нет?

Спасибо!

1 Ответ

3 голосов
/ 09 февраля 2012

Для большинства сред выполнения все загруженные классы будут находиться в ОЗУ, в разделе PermGen памяти Java.

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

Вы можете обойти эту проблему, запустив логику отображения ошибок при запуске программы, за исключением того, что она находится врежим, в котором он отображается невидимымЭто должно использовать тот же путь кода, чтобы загружались все необходимые классы, и гарантировать, что они уже известны, когда вам нужно отобразить свою ошибку.Если это слишком сложно, вы можете просто вместо этого вручную вызвать Class.forName("javax.swing.JOptionPane") (для каждого необходимого класса), хотя это более хрупко и может сломаться, если вы измените код рендеринга без обновления жестко закодированных классов для загрузки.

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

...