Jruby Gems-in-a-Jar-Problem

9

Ich versuche, Code in Ruby (mit jruby) zu schreiben, um ihn mit jrubyc zu java bytecode zu kompilieren und auf einem entfernten Rechner zu implementieren, wo er auf der JVM ausgeführt wird (kein Ruby ist dort verfügbar).

Alles funktioniert gut, solange ich mit der Standard jruby-Bibliothek glücklich bin. Wie auf der jruby-Website erklärt, kopiere ich einfach die jruby-complete.jar-Bibliothek auf den Remote-Rechner und lege sie zur Laufzeit in den Klassenpfad ein. Ich feuere mein kompiliertes Skript und es funktioniert: cool!

Die Probleme beginnen, wenn ich andere Bibliotheken (normalerweise Rubygems) brauche, um mein Skript auszuführen.
Ich kenne coole Sachen wie rawr, die ich erfolgreich getestet habe, um alles, was du brauchst, in einem einzigen Paket zusammenzustellen. Aber das ist nicht die Lösung, nach der ich suche: Ich werde viele kleine Skripte haben, die unabhängig voneinander laufen, und ich möchte nicht, dass jeder von ihnen auf mindestens 10 MB anwächst, nur weil ich jruby-complete.jar wahnsinnig in jedes davon einfüge sie.

Was ich möchte, ist eine .jar für jede der Bibliotheken zu kompilieren, die ich benutzen muss, alle in einen gemeinsamen Ordner auf dem fernen Rechner zu legen und sie zur Laufzeit in den Klassenpfad einzufügen, wenn ich meine kompilierte Version ausführe jruby-Skripte auf der JVM.
Das sagte, ich habe versucht, den Anweisungen hier zu folgen: Ссылка
Ich habe genau das dort gezeigte Beispiel mit dem "chronischen" Edelstein ausprobiert. Gehen Sie Schritt für Schritt:

  1. Installiere den Edelstein lokal: java -jar jruby-complete-1.1.6.jar -S gem install -i ./chronic chronisch --no-rdoc --no-ri
  2. Verpacke es in ein Glas: jar cf chronic.jar -C chronisch.
  3. Schreiben Sie ein zweizeiliges Testskript und speichern Sie es als testt.rb:

      

    erfordern "chronisch"
         Chronic.parse ('morgen')

  4. Kompilieren Sie mit: jrubyc testt.rb

  5. Führen Sie die resultierende Java-Klasse testt.class mit dem folgenden Befehl aus (mit jruby-complete.jar und chronic.jar im selben Ordner wie die Java-Klasse): java -cp.: / jruby-complete.jar: ./ chronic.jar testt

Ich erhalte den folgenden Fehler:

Ausnahme in der Hauptdatei des Threads: /Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar! /METAINF/jruby.home/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.rb : 1: in 'const_missing': nicht initialisierte Konstante Chronic (NameError)
    aus testt.rb: 2
    ... interner jruby stack elided ...
    aus Module.const_missing (testt.rb: 2)
    von (unbekannt). (unbekannt) (: 1)

Ich verstehe wirklich nicht, was ich falsch mache, und ich stehe total darauf. Ich bin ein Noob in Ruby, viel mehr an Python gewöhnt: Verpasse keine Chance, einen Ungläubigen zu bekehren! :-) Vielen Dank.

    
antonio 19.04.2010, 00:36
quelle

2 Antworten

2

Nach allem, was ich sagen kann, sieht es so aus, als würden Sie nichts falsch machen, und Sie haben wahrscheinlich einen Fehler gemacht. Können Sie Ihr Beispiel mit einer neueren Version ausprobieren ( Ссылка ) und wenn das Problem weiterhin auftritt, erstellen Sie einen Fehler unter Ссылка ? Danke.

    
Nick Sieger 20.04.2010 18:32
quelle
1

Setzen Sie dies oben in Ihrem Testskript:

require 'rubygems'

    
Rob 19.04.2010 07:49
quelle

Tags und Links