2011-11-25 69 views
11

我试图禁止在一些罐子中调用System.exit(int);禁止呼叫System.exit

这些罐子将由外部团队开发并由我们的“容器”应用程序加载。

我的第一个反应是使用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) 
) 

为什么在我彬路径中的所有类都java.lang.RuntimePermission exitVM授予?????

感谢

+0

显然'java.lang.RuntimePermission exitVM'是默认授予的,也许你必须明确地拒绝它。 – Romain

+0

我希望exitVM权限默认打开。如果一段Java代码到达其执行的末尾,那么可能需要隐式调用System.exit(0)来告诉虚拟机已完成。 – Chris

+0

虽然我假设你想知道如何关闭它,但会建议编辑问题来具体询问。 – Chris

回答

2

RuntimePermission的Javadoc:

注:“exitVM *”的权限自动授予从应用程序类路径加载所有的代码,从而使应用程序终止自己。

阅读此内容,似乎您必须通过编写自己的SecurityManager明确拒绝此权限。 (例如,看到这个答案:Prevent System.exit to actually exit the JVM

+0

谢谢,你发现它! – kiki

1

或者你可以做AOP并拦截System.exit。自己做这些工作就是:创建你自己的类加载器并使用BPEL来跟踪System.exit,并修补这些调用。真的不是很大的努力。

3

根据错误报告http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238,策略文件没有禁止System.exit()调用。我正在使用Java 1.6运行一个应用程序,尽管它已经“解决”,但仍然看到了这个错误。与OP类似,我有一个系统范围的策略文件,它不包含exitVM的权限。但是,我可以在不抛出任何异常的情况下退出应用程序。

我对包含自定义策略文件的理解是,除策略文件中包含的所有权限外,所有权限均被列入黑名单。由于exitVM不包括在内,因此应该禁止使用(覆盖MicSim提到的默认权限)。但这种情况并非如此。