【问题标题】:How to pass system system properties from jruby to Rails server如何将系统系统属性从 jruby 传递到 Rails 服务器
【发布时间】:2017-11-06 09:56:04
【问题描述】:

我正在通过 JRuby 运行本地 Rails 服务器 (WEBrick),并希望测试一些最终将在 Torquebox 上运行的代码。我正在尝试通过ENV_JAVA 访问一些自定义Java 系统属性。这些系统属性将在 Torquebox 上运行时可用,因此为了在本地测试我的代码,我使用“-J”参数在命令行中传递系统属性。
当我只运行 JRuby 时,一切正常,我可以访问我的自定义属性。

C:\jruby\jruby-1.7.24\bin\jruby.exe -J-Dmy_prop=my_value -e "puts ENV_JAVA['my_prop']"

这只是将“my_value”打印出来。

我的问题是在运行本地 Rails 服务器时尝试访问这些自定义属性。我启动本地 Rails 服务器的命令行如下所示:

C:\jruby\jruby-1.7.24\bin\jruby.exe -J-Dmy_prop=my_value C:\jruby\jruby-1.7.24\bin\rails s

当 WEBrick 启动时,我的自定义属性 "my_prop" 不再位于 ENV_JAVA 中。看起来这是因为在 railties Rails::AppRailsLoader 模块内部,exec_app_rails 只是通过调用内核 exec 方法并传入命令参数来用另一个进程替换当前进程。

这不会保留自定义属性。有谁知道我该如何解决这个问题?我目前正在运行 Rails 4.2.6。看起来在 Rails 5 中模块名称更改为 Rails::AppLoader

【问题讨论】:

  • 没有人吗?哇,我很惊讶这以前没有出现过。与此同时,为了解决这个问题,我不得不编辑 railties gem 来完成这项工作。在 gems lib/rails/app_rails_loader.rb 中,我不得不将调用 exec RUBY, exe, *ARGV 的 exec_app_rails 方法更改为 exec RUBY, -D-Dmy_prop=my_value, exe, *ARGV
  • 将代码放入 cmets 太痛苦了……见下文

标签: java ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

与同事讨论后,我发现我可以通过调用来运行我的 rails 服务器

jruby.exe -J-Dmy_prop=my_value script/rails 

在我的项目目录中。所以我什至不需要运行 rails.bat 脚本。希望这可以帮助某人

【讨论】:

    【解决方案2】:

    所以我想出了一个更好的(?)方法来处理这个问题。而不是:

    exec RUBY, exe, *ARGV
    

    我可以这样做:

    custom_sys_props = {}
    current_sys_props = ENV_JAVA.to_hash
    default_sys_props = eval(%x(#{RUBY} -e "puts ENV_JAVA"))
    current_sys_props.each {|k,v| custom_sys_props[k] = v if default_sys_props[k] != v }
    jruby_props = []
    custom_sys_props.each{|k,v| jruby_props << "-J-D#{k}=#{v}"}         
    exec RUBY, *jruby_props, exe, *ARGV
    

    它很丑,而且真的只适用于 JRuby,但我不知道有更好的方法来处理它。还是很遗憾之前没有解决这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 2017-03-02
      • 2014-01-04
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多