java - 使用 warble 将带有 Rubeus 和 Swing 的 JRuby 脚本打包到 jar 中后退出

标签 java swing concurrency 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

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

java -jar jtest.jar

... JFrame 窗口出现并立即关闭。

没有任何类型的错误指示。

有人知道为什么会这样吗?

最佳答案

在您的主脚本退出后,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

Hacky,但它有效。

关于java - 使用 warble 将带有 Rubeus 和 Swing 的 JRuby 脚本打包到 jar 中后退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10108822/

相关文章:

java - 输入2个字后扫描仪崩溃

java - GridBagConstraints 无法正常工作?需要从面板的最左侧开始

java - 更改 drawstring() 中文本的颜色

java - ConcurrentHashmap 在我的实现中是否需要同步?

java - 当 set 在 Java 中已经是原子的时,为什么我们需要 compareAndSet?

multithreading - 在 Perl 6 中运行自馈 channel

java - 在编写 Spring 集成测试时从 Spring 组件扫描中排除特定类

java - 为什么 C 和 Java 对 float 的舍入方式不同?

java - JDBC - Statement、PreparedStatement、CallableStatement 和缓存

java - 如何向用户显示可编辑的结果?