JRuby-防止JVM退出

时间:2018-07-06 22:59:48

标签: java jruby exit

我正在从一个包含System.exit()的外部库中调用一个方法,并在调用该方法时关闭JVM。如果遇到这种情况,是否有办法阻止通过JRuby创建的JVM运行System.exit()?

1 个答案:

答案 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))结束,需要在调用堆栈中进行处理。

请注意,这可能是一个非常“棘手的”解决方法...