带有Rubeus和Swing的JRuby脚本一旦使用warble打包到jar中就会退出

ala*_*dac 2 java concurrency swing jruby jframe

我试图将一个简单的JRuby脚本打包到一个jar文件中.该脚本使用Rubeus :: Swing,并在使用JRuby解释器执行时正确运行.

require 'rubygems'
require 'rubeus'

class Example01
  extend Rubeus::Swing
  def show
    JFrame.new("Rubeus Swing Example 01") do |frame|
      frame.visible = true
    end
  end
end
Example01.new.show
Run Code Online (Sandbox Code Playgroud)

一旦我将脚本打包到JAR中warble,当我执行时:

java -jar jtest.jar
Run Code Online (Sandbox Code Playgroud)

... JFrame窗口显示并立即关闭.

没有任何错误的迹象.

有谁知道为什么会这样?

小智 7

Warbler在主脚本退出后调用System.exit().这会导致Swing EventThread退出,关闭您的应用程序.

https://github.com/jruby/warbler/blob/master/ext/JarMain.java#L131

我通过加入我的启动脚本底部的事件线程来解决这个问题,如下所示:

event_thread = nil
SwingUtilities.invokeAndWait { event_thread = java.lang.Thread.currentThread }
event_thread.join
Run Code Online (Sandbox Code Playgroud)

哈基,但它的工作原理.