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

时间:2013-01-25 06:17:23

标签: java jruby

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

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

我希望使用最新版本的JRuby。

2 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:3)

维基页面:Scripting Java from JRuby (jruby 1.0+)包含您可以用来获取包装的优秀建议和想法

我觉得有趣的是使用Module名称来限制对导入的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之间的类名歧义
  • “混入”多个Java接口到JRuby中的Jruby模块
  • 异常处理
  • 用于线程安全的对象同步

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