8

我希望将一个 ruby​​ (JRuby) 包装器放在一个中型 Java 库上,并且正在寻找关于从包装到策略的所有最佳实践的建议和文章。

我在这里找到了关于这个主题的相对过时的(2009 年)讨论:http ://www.ruby-forum.com/topic/188447 。

我正在寻找使用最新版本的 JRuby。

4

2 回答 2

8

我已经为 Java 库(EurydiceHotBunniesMessagePackRubydoopMikka等)编写了一些包装器。其中一些只是适应 Java 库的 JRuby 代码,其中一些包含与 JRuby 运行时接口的 Java 代码(MessagePack实际上完全用 Java 编写)。

我发现没有很好解决的问题是如何为 Java 库发送 JAR 文件。您不想将它包含在 gem 中,因为那样您最终会陷入 JAR 地狱。像 Netty 这样的通用 Java 库将捆绑在许多 gem 中,最终您将拥有捆绑不兼容版本的 gem。我已经通过打包仅包含 Java 库 JAR 的 gem(参见例如scala-library-jarsning-compress-jars)然后让我的包装器依赖于该 gem 解决了这个问题。它不是一个特别可扩展的解决方案,但至少它比将 JAR 捆绑在包装器 gem 中更易于管理。

你的问题不是很清楚你想知道什么,我建议你修改并更具体。但是,这里有一些随机的事情在我的脑海中

  • 让 Ruby 更容易访问 Java API 的一种快速方法是向 Java 类和接口添加方法。这就像打开一个 Ruby 类一样简单(但 Java 接口是模块),并且可以使在 Ruby 中处理 Java 对象变得更加容易。这些方法只会被 Ruby 看到,它们不会被 Java 代码看到。
  • 不要java_import进入全局范围。会给大家带来很多麻烦。请记住,这java_import不像import在 Java 中它只是文件的本地文件,它实际上是在范围内创建一个别名。包装java_importinclude_package模块。
  • 不要使用import——它与 Rake 不兼容。
于 2013-02-23T21:13:02.857 回答
3

wiki 页面:Scripting Java from JRuby (jruby 1.0+)包含极好的建议和想法,您可以利用它们来获取包装器

我认为使用模块名称来确定对导入的 Java 类的访问范围很有趣

例如:创建一个名为JavaLangDemo的 Ruby 模块,其中包含 Java 包 java.lang 中的类。

 module JavaLangDemo
   include_package "java.lang"
   # alternately, use the #import method
   import "java.lang"
 end

现在,您可以使用 JavaLangDemo:: 作为所需 Java 类名称的前缀,以访问包含的类:

 version = JavaLangDemo::System.getProperties["java.runtime.version"]
 => "1.5.0_13-b05-237"
 processors = JavaLangDemo::Runtime.getRuntime.availableProcessors
 => 2

本文还解释了以下主题:

  • 在 Ruby 中实现 Java 接口
  • Java和Ruby之间的类名歧义
  • 在 JRuby 中“混入”多个 Java 接口到 Jruby 模块
  • 异常处理
  • 线程安全的对象同步

并包含指向“相关文章”的有用链接列表,以获取有关 Java 集成层的更多信息

于 2013-01-29T21:35:11.233 回答