在Ruby中包装现有Java库的最佳方法(JRuby)

jus*_*don 8 java jruby

我希望将一个ruby(JRuby)包装器放在一个中等大小的Java库上,我正在寻找有关从包装到策略的各种最佳实践的建议和文章.

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

我想使用最新版本的JRuby.

The*_*heo 8

我为Java库编写了一些包装器(Eurydice,HotBunnies,MessagePack,Rubydoop和Mikka等).其中一些只是适应Java库的JRuby代码,其中一些包括与JRuby运行时接口的Java代码(MessagePack实际上完全用Java编写).

我发现的事情并没有得到很好的解决,那就是如何为Java库提供JAR文件.你不想把它包含在gem中,因为那样你最终会最终进入JAR地狱.像Netty这样的常见Java库将捆绑在许多宝石中,最终你会拥有捆绑不兼容版本的宝石.我通过打包只包含Java库JAR的gems来解决这个问题(例如参见scala-library-jars和ning-compress-jars),然后让我的包装器依赖于那个gem.它不是一个特别可扩展的解决方案,但至少它比在包装器gem中捆绑JAR更易于管理.

你的问题不清楚你想要知道什么,我建议你修改并更具体.然而,这里有一些随意的东西

  • 使Ruby更易于访问Java API的一种快速方法是向Java类和接口添加方法.它就像打开Ruby类一样简单(但Java接口是模块),并且可以更容易地在Ruby中使用Java对象.这些方法只能由Ruby看到,它们对Java代码不可见.
  • 不要java_import进入全球范围.这会给每个人带来很多麻烦.请记住,java_import不像import在Java中它是唯一在该文件中,它实际上创造范围的别名.包装java_import和include_package模块.
  • 不要使用import- 它与Rake不兼容.


Fra*_*ini 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以在所需的 Java 类名称前加上 JavaLangDemo:: 来访问包含的类:

 version = JavaLangDemo::System.getProperties["java.runtime.version"]
 => "1.5.0_13-b05-237"
 processors = JavaLangDemo::Runtime.getRuntime.availableProcessors
 => 2
Run Code Online (Sandbox Code Playgroud)

本文还解释了以下主题:

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

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