JRuby - 防止 JVM 退出

JRuby - Prevent JVM from exiting

我正在从包含 System.exit() 的外部库调用方法,在调用该方法时关闭 JVM。有没有办法阻止通过 JRuby 创建的 JVM 如果遇到 运行 System.exit()?

您可以使用 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)) 需要在调用堆栈中处理。

请注意,这可能是一个非常 "hacky" 的解决方法...