Рассмотрим приложение 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>