8

中規模の Java ライブラリに Ruby (JRuby) ラッパーを配置することを検討しており、パッケージングから戦略までのすべてのベスト プラクティスに関するアドバイスと記事を探しています。

ここで、このトピックに関する比較的古い (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にバンドルする場合よりも管理しやすくなります。

あなたの質問は、あなたが知りたいことを正確に明確にしていないので、修正してより具体的にすることをお勧めします。しかし、ここに私の頭の上からいくつかのランダムなものがあります

  • Java APIをRubyにアクセスしやすくする簡単な方法は、Javaクラスとインターフェースにメソッドを追加することです。Rubyクラスを開くのと同じくらい簡単です(ただし、Javaインターフェイスはモジュールです)。RubyでのJavaオブジェクトの操作をはるかに簡単にすることができます。これらのメソッドはRubyでのみ表示され、Javaコードでは表示されません。
  • java_importグローバルスコープに入らないでください。それは皆にとって多くの問題を引き起こすでしょう。これは、ファイルに対してローカルであるだけのJavaとは異なり、実際にはスコープ内にエイリアスを作成していることを忘れないでくださいjava_importimportラップjava_importinclude_packageてモジュールに入れます。
  • 使用しないでくださいimport-Rakeとは互換性がありません。
于 2013-02-23T21:13:02.857 に答える
3

wiki ページ: Scripting Java from JRuby (jruby 1.0+)には、ラッパーを入手するために利用できる優れたアドバイスとアイデアが含まれています。

モジュール名を使用して、インポートされたJavaクラスへのアクセスをスコープするのは興味深いと思います

例: Java パッケージ java.lang のクラスを含むJavaLangDemoという名前の Ruby モジュールを作成します。

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

これで、目的の Java クラス名の前に JavaLangDemo:: を付けて、含まれているクラスにアクセスできます。

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

この記事では、次のトピックについても説明します。

  • Ruby で Java インターフェイスを実装する
  • Java と Ruby の間のクラス名のあいまいさ
  • JRuby の Jruby モジュールへの複数の Java インターフェースの「混合」
  • 例外処理
  • スレッドセーフのためのオブジェクトの同期

また、Java 統合レイヤーの詳細については、「関連記事」への便利なリンクのリストが含まれています。

于 2013-01-29T21:35:11.233 に答える