Beste Methode, eine vorhandene Java-Bibliothek in Ruby (JRuby) zu schreiben

8

Ich möchte einen Ruby (JRuby) -Wrapper über eine mittelgroße Java-Bibliothek legen und suche nach Ratschlägen und Artikeln über Best Practices für alles von der Verpackung bis zur Strategie.

Ich fand eine relativ veraltete (2009) Diskussion zu diesem Thema hier: Ссылка .

Ich möchte die neueste Version von JRuby verwenden.

    
justingordon 25.01.2013, 06:17
quelle

2 Antworten

7

Ich habe ein paar Wrapper für Java-Bibliotheken geschrieben ( Eurydice , HotBunnies , Nachrichtenpaket , Mikka , unter anderem). Einige von ihnen sind nur JRuby-Code, der die Java-Bibliothek anpasst, und einige von ihnen enthalten Java-Code, der mit der JRuby-Laufzeitumgebung ( MessagePack ist tatsächlich komplett in Java geschrieben).

Die Sache, die ich gefunden habe, ist nicht sehr gut gelöst, wie man die JAR-Datei für die Java-Bibliothek liefert. Du willst es nicht in den Edelstein mit einbeziehen, denn dann wirst du schließlich in der JAR-Hölle landen. Gewöhnliche Java-Bibliotheken wie Netty werden in vielen Edelsteinen gebündelt und schließlich haben Sie Edelsteine, die inkompatible Versionen bündeln. Ich habe dieses Problem gelöst, indem ich Edelsteine ​​verpackt habe, die nur die Java-Bibliothek JAR enthalten (siehe zum Beispiel scala-library-jars und ning-compress-jars ) und dann hängt mein Wrapper von diesem Juwel ab. Es ist keine besonders skalierbare Lösung, aber es wird zumindest einfacher zu verwalten sein, als wenn Sie JAR im Wrapper-Juwel bündeln.

Ihre Frage ist nicht sehr klar, was genau Sie wissen wollen, ich schlage vor, Sie zu überarbeiten und genauer zu sein. Aber hier sind ein paar zufällige Dinge von der Spitze meines Kopfes

  • Eine schnelle Möglichkeit, eine Java-API für Ruby zugänglicher zu machen, besteht darin, Methoden zu Java-Klassen und -Schnittstellen hinzuzufügen. Es ist so einfach wie das Öffnen einer Ruby-Klasse (aber Java-Interfaces sind Module) und kann das Arbeiten mit Java-Objekten in Ruby wesentlich erleichtern. Diese Methoden werden nur von Ruby gesehen, sie sind für Java-Code nicht sichtbar.
  • Fügen Sie java_import nicht in den globalen Bereich ein. Es wird viel Ärger für alle verursachen. Denken Sie daran, dass java_import nicht wie import in Java ist, wo es nur lokal für die Datei ist, sondern tatsächlich einen Alias ​​im Bereich erstellt. Wrap java_import und include_package in Modulen.
  • Verwenden Sie nicht import - es ist nicht kompatibel mit Rake.
Theo 23.02.2013 21:13
quelle
3

Die Wiki-Seite: Java-Skripte von JRuby (jruby 1.0+) enthält ausgezeichnete Ratschläge und Ideen, die Sie vielleicht haben Hebel, um Ihren Wrapper zu erhalten

Ich halte es für interessant, den Modulnamen zu verwenden, um den Zugriff auf die importierte Java-Klasse zu ermöglichen.

Beispiel: Erstellen Sie ein Ruby-Modul namens JavaLangDemo , das die Klassen im Java-Paket java.lang enthält.

%Vor%

Nun können Sie den gewünschten Java-Klassennamen mit JavaLangDemo :: voranstellen, um auf die enthaltenen Klassen zuzugreifen:

%Vor%

Der Artikel erläutert auch die folgenden Themen:

  • Implementierung einer Java-Schnittstelle in Ruby
  • Klassenname Ambiguität zwischen Java und Ruby
  • "mehr als eine Java-Schnittstelle zu Jruby-Modulen in JRuby"
  • Ausnahmebehandlung
  • Synchronisation von Objekten zur Threadsicherheit

und enthält eine Liste nützlicher Links zu "Verwandte Artikel" für weitere Informationen über Java-Integrationsschicht

    
Franco Rondini 29.01.2013 21:35
quelle

Tags und Links