我正在从一个包含System.exit()的外部库中调用一个方法,并在调用该方法时关闭JVM。如果遇到这种情况,是否有办法阻止通过JRuby创建的JVM运行System.exit()?
答案 0 :(得分:0)
您可以使用JRuby为JVM安装SecurityManager:
class SecurityManagerImpl < java.lang.SecurityManager
def checkExit(status)
raise java.lang.SecurityException.new("HALTED System.exit(#{status})") if status == 42
end
# optionally - disable all other checks from happening :
superclass.instance_methods(false).select { |name| name.to_s.start_with?('check') }.each do |name|
class_eval "def #{name}(*args) end" if name != :checkExit
end
end
java.lang.System.setSecurityManager(SecurityManagerImpl.new)
现在,所有exit(42)
调用都将失败,并以Java::JavaLang::SecurityException (HALTED System.exit(42))
结束,需要在调用堆栈中进行处理。
请注意,这可能是一个非常“棘手的”解决方法...