如何为现有 ruby 项目创建 java 界面
How to create java interface for existing ruby project
我的项目有一个重要且孤立的部分是用 ruby(jruby compatible) 编写的。这是一个命令行应用程序,我们在终端中 运行 它并为其提供各种选项标志。
我的客户想使用这个工具,但只有当它被包装在 java class 中时才愿意使用它。我费了很大的劲才把ruby代码用jrubyc --javac A.rb
转换成java。检查转换后的 .java 文件,它正在调用 Ruby 运行时来执行 ruby 脚本。像这样:
org.jruby.Ruby.getGlobalRuntime().executeScript(stringBuiltFromARubyFile, 'path')
我的问题是性能方面的,这比仅仅包装创建一个 运行nable jar,用一个带某些参数的 java class 包装它,然后执行通过 Runtime.getRuntime().exec("java -jar A.jar args")
罐子?
应用程序A.rb使用多线程。我使用 jruby-gradle 插件引入 ruby 依赖项(宝石)。
我可以探索哪些其他选项?
提前致谢。
您使用的方法可能行不通。您正在 ruby 上下文中启动 JVM;您所要求的是在 JVM 上下文中启动一些 ruby 代码。
我会查看 C 到 Ruby 的绑定,然后使用 Java 到 C (JNI) 接口从 C 层启动所需的 Ruby 代码。如果这样的事情不切实际,因为你的 Ruby 比 CLI 进程更像是一个常备服务,我会考虑制作一组 Java 库来通过网络调用来调用进程。
我的项目有一个重要且孤立的部分是用 ruby(jruby compatible) 编写的。这是一个命令行应用程序,我们在终端中 运行 它并为其提供各种选项标志。
我的客户想使用这个工具,但只有当它被包装在 java class 中时才愿意使用它。我费了很大的劲才把ruby代码用jrubyc --javac A.rb
转换成java。检查转换后的 .java 文件,它正在调用 Ruby 运行时来执行 ruby 脚本。像这样:
org.jruby.Ruby.getGlobalRuntime().executeScript(stringBuiltFromARubyFile, 'path')
我的问题是性能方面的,这比仅仅包装创建一个 运行nable jar,用一个带某些参数的 java class 包装它,然后执行通过 Runtime.getRuntime().exec("java -jar A.jar args")
罐子?
应用程序A.rb使用多线程。我使用 jruby-gradle 插件引入 ruby 依赖项(宝石)。
我可以探索哪些其他选项?
提前致谢。
您使用的方法可能行不通。您正在 ruby 上下文中启动 JVM;您所要求的是在 JVM 上下文中启动一些 ruby 代码。
我会查看 C 到 Ruby 的绑定,然后使用 Java 到 C (JNI) 接口从 C 层启动所需的 Ruby 代码。如果这样的事情不切实际,因为你的 Ruby 比 CLI 进程更像是一个常备服务,我会考虑制作一组 Java 库来通过网络调用来调用进程。