Как разрешить дочернему загрузчику классов выходить из ВМ? - PullRequest
0 голосов
/ 18 мая 2011

Рассмотрим приложение Web Start, которое помещает несколько jar-файлов в каталог, а затем выполняет один из них. Подумайте о лаунчере / оболочке.

Для этого я создаю дочерний URL-загрузчик классов, указывающий на jar-файлы, загружаю класс и приказываю ему запустить его main(). Внутри него создается JFrame с EXIT_ON_CLOSE закрытием по умолчанию.

Загрузчик классов выполнен как:

URLClassLoader cl = new URLClassLoader(
    new URL[] { new File(tgtPath + "/inner.jar").toURI().toURL() },
    Launcher.class.getClassLoader());
Class main = cl.loadClass("inner.Main");
main.getMethod("main", String[].class).invoke(
    null, 
    new Object[] { new String[] { "My arg" } });

К сожалению, это приводит к следующему исключению:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at outer.Launcher.main(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:1804)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1750)
at com.sun.javaws.Launcher.doLaunchApp(Launcher.java:1512)
at com.sun.javaws.Launcher.run(Launcher.java:130)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.0)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkExit(SecurityManager.java:744)
at javax.swing.JFrame.setDefaultCloseOperation(JFrame.java:372)
at inner.Main.main(Unknown Source)
... 14 more

Я считаю, что причина в том, что дочернему загрузчику классов не разрешено выходить из ВМ. Как я могу отключить или обойти это ограничение?

РЕДАКТИРОВАТЬ - отвечая на комментарии: я действительно хочу, чтобы внутренний процесс мог вызывать System.exit, а не соединять приложение и средство запуска вместе.

Настройки безопасности для JNLP:

<security>
  <all-permissions/>
</security>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...