2013-01-23 91 views
1

伙计们,我试图在RoR中执行一个jar文件。感谢所以,我想到了使用IO :: popen调用来执行jar文件。Ruby on Rails:执行JAR

要求: - 登录网站:让我们公司的员工登录。它是一个Java库,如果用户名/密码有效,它会做一些魔术和数字。我照做了使用,

result = IO::popen("java -cp auth.jar com.name.auth.LDAPLookup " + params[:username] + " " + params[:password]).read 
p result 

输出: “授权”, “电子邮件”, “ID”]

  • 没有输入消毒完成。这是有风险的。任何人都可以在用户名/密码中键入内容,并且将在服务器中执行。

我不知道该怎么做。我想尝试的一个选择是使用fork()或Process API来启动“java”并传递参数。但无法弄清楚。任何其他想法?

回答

2

除了你提到的问题之外,这在性能方面听起来相当痛苦(毕竟,你正在等待JVM启动每一个请求)。

两种解决方案在我跳出:

  • 会是什么样的库做,看看你是否真的需要调出Java的这种;特别是,如果它只是一个与一组罐头参数的LDAP目录进行查找的问题,也有大量的宝石为

  • 如果必须化妆使用Ruby中的Java类,认真考虑使用JRuby,它可以直接调用Java类,既不会在每次调用时重新启动JVM的开销,也不会冒着尝试正确地将您的参数从Ruby转换为shell到JVM的风险, 。

+0

感谢您的回复Jimwise。我同意,这是一个表现痛苦。在演示之前我没有足够的时间查找宝石来执行LDAP查找。我喜欢你的JRuby想法!当我在SO上快速搜索jruby时,人们抱怨可用的GEM和Jruby vs Ruby的性能。然后我决定使用普通的Ruby进行切换。在这一点上转移到JRuby有多容易?任何指针? –

+0

试用JRuby应该相当简单 - 如果您安装了JRuby,那么您在JRuby上的工作流程与您现在正在做的事情没有多大区别,只需输入'jruby -S $ command'就可以了。你今天在那里输入'$ command'。例如,要测试你的Rails应用程序,你可以执行'jruby -S bundle install; jruby -S bundle exec rails s'(或类似的)。或者你也可以使用RVM的JRuby支持(https://rvm.io/interpreters/jruby/)来使这个改变消失。 :-) – jimwise