【问题标题】:Ruby on Rails: Executing JARRuby on Rails:执行 JAR
【发布时间】:2023-05-25 12:04:02
【问题描述】:

伙计们,我正在尝试在 RoR 中执行一个 jar 文件。感谢 SO,我想使用 IO::popen 调用来执行 jar 文件。

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

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

输出:["Authorized", "email", "id"]

  • 未完成输入清理。这是有风险的。任何人都可以在用户名/密码中输入一些内容,并将在服务器中执行。

我不知道该怎么做。我想尝试的一种选择是使用 fork() 或 Process API 来启动“java”并传递参数。然而想不通。还有其他想法吗?

【问题讨论】:

    标签: ruby-on-rails process jar io popen


    【解决方案1】:

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

    两个解决方案突然出现在我面前:

    • 看看这个库做了什么,看看你是否真的需要为此调用 Java;特别是,如果它只是一个使用一组固定参数在 LDAP 目录中进行查找的问题,那么有很多宝石可以解决这个问题

    • 如果您必须使用 Ruby 中的 Java 类,强烈考虑使用 JRuby,它可以让您直接调用有问题的 Java 类,而无需重新启动JVM 每次调用,也没有尝试正确地将参数从 Ruby 转义到 shell 到 JVM 并返回的风险。

    【讨论】:

    • 感谢吉姆怀斯的回复。我同意,性能很痛苦。在演示之前我真的没有足够的时间来查找 gem 来进行 LDAP 查找。我喜欢你的 JRuby 主意!当我在 SO 中快速搜索 jruby 时,人们抱怨可用的 GEM 以及 Jruby 与 Ruby 的性能。然后我决定使用常规 Ruby 进行切换。此时迁移到 JRuby 有多容易?有什么指点吗?
    • 试用 JRuby 应该很容易——如果你安装了 JRuby,你在 JRuby 上的工作流程不会和你现在做的有太大不同,只要养成打字的习惯jruby -S $command 你今天在哪里输入 $command。例如,要测试您的 Rails 应用程序,您将执行 jruby -S bundle install ; jruby -S bundle exec rails s(或类似操作)。或者您可以使用 RVM 的 JRuby 支持 (rvm.io/interpreters/jruby) 来消除这种变化。 :-)
    相关资源