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" 的解决方法...
我正在从包含 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" 的解决方法...