2017-06-05 82 views
1

我正在通过JRuby运行本地Rails服务器(WEBrick),并且想要测试一些最终将在Torquebox上运行的代码。我试图通过ENV_JAVA访问一些定制的Java系统属性。当在Torquebox上运行时,这些系统属性将可用,以便在本地测试我的代码,我使用“-J”参数在命令行上传递系统属性。
当我只运行JRuby时,一切正常,我可以访问我的自定义属性。如何将系统属性从jruby传递到Rails服务器

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不再。看起来这是因为在Rails :: Rails :: AppRailsLoader模块中,exec_app_rails简单地通过调用内核exec方法并传入命令参数来将当前进程替换为另一个进程。

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

+0

没有人?哇,我很惊讶,这是以前没有出现过。与此同时,要解决这个问题,我必须编辑railties gem来完成这项工作。在宝石LIB /导轨/ app_rails_loader.rb,我不得不改变它调用exec_app_rails方法: 'EXEC RUBY,EXE,* ARGV' 到 'EXEC RUBY,-D-Dmy_prop = MY_VALUE,EXE,* ARGV ' –

+0

在评论中放置代码是如此痛苦......见下文 –

回答

0

所以我想出了一个更好的方法来处理这个问题。相反的:

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的,但我不知道一个更好的方式来处理它。不过可惜,这并没有被

0

之前解决与同事讨论后,原来我可以从我的项目目录中调用

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

运行我的Rails服务器。所以我甚至不需要运行rails.bat脚本。希望这可以帮助别人

相关问题