移植库时首先要做什么
What to do first when porting library
我想访问 Ruby 中的 Java 库,例如 Kafka 已经为每个操作提供了 jar,如果我想从 Ruby 使用它我需要做什么?
可能我只需要 运行 shell 命令到 运行 Ruby 中的 Jar,或者我是否需要将库移植到 Ruby?如果归结为移植库,那该怎么做呢?
提前致谢
PS:Java、Ruby或Kafka只是例子。我需要知道的是如何移植图书馆的大局。当然,如果您也添加一些代码示例,我会非常高兴:)
使用 JRuby,您可以导入 jar 文件,然后在该 jar 中包含您需要的 类:
require 'java'
require '/path/to/your.jar'
include_class 'com.really.long.ClassName'
但是对于 JRuby 以外的 Ruby 实现,您别无选择,只能与外部 java 进程通信(通过套接字、IPC、kill...)。
我同意 Aetherus 的观点,即使用 JRuby 是最快最方便的方法。然而,我相信除了 与外部 Java 进程通信 之外,还有其他选择。选择什么可能取决于你想调用什么代码。我看到至少两个其他选项。
- 将要调用的Java代码包裹在主程序中,在命令行中调用。这会很慢,因为 Java 需要开始并且需要很长时间,但在某些情况下可能是一个快速前进的方式。
- 从使用 Ruby 编译的 C 代码中调用 Java 代码。这仍然需要加载 JVM,但您可能只需要加载一次。我发现 article 概述了如何使用 JNI 解决此问题。
这两条路都可能会给您带来很多痛苦,但如果坚持进行 MRI 很重要,那么这趟旅行可能是值得的。玩得开心!
我想访问 Ruby 中的 Java 库,例如 Kafka 已经为每个操作提供了 jar,如果我想从 Ruby 使用它我需要做什么?
可能我只需要 运行 shell 命令到 运行 Ruby 中的 Jar,或者我是否需要将库移植到 Ruby?如果归结为移植库,那该怎么做呢?
提前致谢
PS:Java、Ruby或Kafka只是例子。我需要知道的是如何移植图书馆的大局。当然,如果您也添加一些代码示例,我会非常高兴:)
使用 JRuby,您可以导入 jar 文件,然后在该 jar 中包含您需要的 类:
require 'java'
require '/path/to/your.jar'
include_class 'com.really.long.ClassName'
但是对于 JRuby 以外的 Ruby 实现,您别无选择,只能与外部 java 进程通信(通过套接字、IPC、kill...)。
我同意 Aetherus 的观点,即使用 JRuby 是最快最方便的方法。然而,我相信除了 与外部 Java 进程通信 之外,还有其他选择。选择什么可能取决于你想调用什么代码。我看到至少两个其他选项。
- 将要调用的Java代码包裹在主程序中,在命令行中调用。这会很慢,因为 Java 需要开始并且需要很长时间,但在某些情况下可能是一个快速前进的方式。
- 从使用 Ruby 编译的 C 代码中调用 Java 代码。这仍然需要加载 JVM,但您可能只需要加载一次。我发现 article 概述了如何使用 JNI 解决此问题。
这两条路都可能会给您带来很多痛苦,但如果坚持进行 MRI 很重要,那么这趟旅行可能是值得的。玩得开心!