Java 小程序有时会自动关闭
我的java应用程序发生了非常奇怪的事情。总而言之,问题在于,它有时会在工作30-60秒后自动关闭 具体情况如下:Java 小程序有时会自动关闭,java,nullpointerexception,java-7,Java,Nullpointerexception,Java 7,我的java应用程序发生了非常奇怪的事情。总而言之,问题在于,它有时会在工作30-60秒后自动关闭 具体情况如下: System.setSecurityManager(new SecurityManager() { @Override public void checkPermission(Permission p) {} }); URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL(
System.setSecurityManager(new SecurityManager() {
@Override public void checkPermission(Permission p) {}
});
URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL()}, this.getClass().getClassLoader());
Class<?> app = Class.forName("launch.App", true, loader);
Method start = app.getDeclaredMethod("start", URL.class, URL.class);
start.invoke(app.newInstance(), codeBase, documentBase);
- 应用程序实际上是在applet设置中启动的,applet加载主应用程序jar,将其保存到磁盘,然后通过反射启动实际程序。小程序jar已签名,应用程序jar未签名,因此我必须重写安全管理器。代码如下:
System.setSecurityManager(new SecurityManager() { @Override public void checkPermission(Permission p) {} }); URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL()}, this.getClass().getClassLoader()); Class<?> app = Class.forName("launch.App", true, loader); Method start = app.getDeclaredMethod("start", URL.class, URL.class); start.invoke(app.newInstance(), codeBase, documentBase);
- 在关闭钩子启动后,应用程序似乎仍在运行,我在日志中看到了如下异常:
2012.11.13 16:20:07.171 | def.pR.run:1639 | class java.lang.NullPointerException : null sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source) java.security.AccessController.doPrivileged(Native Method) sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source) sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) ... // so on, the exception seems to happen in completely regular app code
- 最后,直到那些Citrix服务器开始使用
(特别是Java7更新9)而不是Java7
,才出现这样的问题。降级java似乎不是一种选择Java6
我在这里完全迷路了。至少有人能给我一些解决这个问题的建议吗?原因可能是什么?有办法解决这些问题吗?重写安全管理器:这难道不意味着您实际上避开了整个Java小程序安全概念吗?发布一个禁用安全管理器的小程序,然后加载另一个应用程序,对我来说,这听起来是一个非常糟糕的主意,尤其是如果你没有Java小程序那么多的安全检查的话。如果有人设法抓取这个小程序,他们可能会使用它从自己的网站加载攻击代码,您可能会被吊销证书 在Java 7u7前后,一个主要的安全问题得到了解决:
可能其中一个更改会影响security manager的单步执行?首先,我希望您在运行下载的应用程序之前正确验证它(通过SSL下载或使用数字签名验证它,在这种情况下,您最好对jar进行签名) 解决这个问题。这很容易,因为您正在applet JVM中运行。小程序jvm的生命周期由浏览器决定。因此,如果您仍然希望使用小程序作为启动器,请在小程序子类的
applet.destroy()
,applet.stop()
方法中插入一些调试输出,并查看这是否与关闭相关
另一个解决方案是使用JavaWebStart启动它。这确实是从web启动java应用程序的最佳方式。“原因可能是什么?”这可能是JRE中的一个错误。请检查,如果您没有找到任何相关内容,请提出一个。@AndrewThompson-我应该在该数据库中查找哪些关键字?JRE版本号可能是一个赠品。我还加入了
NullPointerException
。我通过JavaWebStart启动了它。即使一开始它失败了,我也可以用很多jvm选项和东西来装备它,最后接近这个问题。此外,JWS总体上提供了更多的灵活性。