Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何允许子类加载器退出VM?_Java_Security_Classloader - Fatal编程技术网

Java 如何允许子类加载器退出VM?

Java 如何允许子类加载器退出VM?,java,security,classloader,Java,Security,Classloader,考虑一个Web Start应用程序,它将一些JAR放在一个目录中,然后执行其中一个JAR。设想一个启动器/包装器 为了实现这一点,我创建了一个指向JAR的子URL类加载器,加载一个类并告诉它运行它的main()。它在内部创建一个带有默认关闭操作的JFrame 类加载器的执行方式如下: URLClassLoader cl = new URLClassLoader( new URL[] { new File(tgtPath + "/inner.jar").toURI().toURL() },

考虑一个Web Start应用程序,它将一些JAR放在一个目录中,然后执行其中一个JAR。设想一个启动器/包装器

为了实现这一点,我创建了一个指向JAR的子URL类加载器,加载一个类并告诉它运行它的
main()
。它在内部创建一个带有默认关闭操作的
JFrame

类加载器的执行方式如下:

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
我认为原因是不允许子类加载器退出VM。如何禁用或绕过此限制

编辑-回复评论:我真的希望内部进程能够调用
系统。退出
,而不是将应用程序和启动器耦合在一起

JNLP的安全设置:

<security>
  <all-permissions/>
</security>


您的web start应用程序是否已签名?是。我甚至用同一个密钥在那个目录中的JAR上签名。你能控制内部代码吗?是的,内部代码都是我的。你能在外部代码中调用“System.exit”吗?