Запретить вызов System.exit

Я пытаюсь запретить вызов System.exit(int); в некоторых банках.

Эти банки будут разработаны внешними командами и загружены нашим "контейнерным" приложением.

Мой первый рефлекс заключается в использовании диспетчера безопасности java:

-Djava.security.manager-Djava.security.debug=all

с простейшим файлом ${user.home}/.java.policy:

grant {};

Хотя я больше не могу назвать такой, как System.getProperties() (поскольку у меня нет java.util.PropertyPermission), я могу сделать System.exit(0)!!

В опции java.security.debug=all отображается следующая консоль:

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>)
sun.misc.Launcher $ AppClassLoader @ 10385c1
<no principals>
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM)
(java.io.FilePermission \my-bin-path\- read)
)

Почему все классы в my-bin-пути имеют java.lang.RuntimePermission exitVM, предоставленные

спасибо

Ответ 1

Согласно отчету об ошибке, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238, файл политики не запрещает вызовы System.exit(). Я запускаю приложение с Java 1.6, и я все еще вижу эту ошибку, несмотря на то, что она "разрешена". Подобно OP, у меня есть файл политики системы, который не содержит разрешения для exitVM. Однако я могу выйти из приложения без каких-либо исключений.

Мое понимание включения настраиваемого файла политики заключается в том, что все разрешения занесены в черный список, за исключением тех, которые включены в файл политики. Поскольку exitVM не включен, его следует запретить (переопределяя разрешение по умолчанию, указанное MicSim). Но это не так.

Ответ 2

Из Javadoc RuntimePermission:

Примечание. Разрешение "exitVM. *" автоматически предоставляется ко всему коду, загруженному из пути класса приложения, что позволяет приложениям завершать себя.

Читая это, кажется, вам нужно явно запретить это разрешение, написав собственный SecurityManager. (Например, см. Этот ответ: Предотвратить запуск System.exit для фактического выхода из JVM)

Ответ 3

В качестве альтернативы вы можете сделать АОП и перехватить System.exit. Это можно сделать: создать собственный загрузчик классов и использовать BPEL для отслеживания System.exit и исправления этих вызовов. На самом деле не большие усилия.