ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 11 Jun 2008, 10:40 
Offline
Lehrling

Registriert: 26 Mai 2008, 16:23
Beiträge: 52
Hallo,
ich möchte eine selbst erstellte Java Klasse in mein JRuby Skript einbinden damit ich mit dieser arbeiten kann. Die Java Klasse sieht folgendermaßen aus:


1
2
3
4
5
6
7
8
9
10
package SerialKlasse;
import java.io.Serializable;
public class Listenklasse implements Serializable{
int zahl;
String buchstaben;
public Listenklasse (int wert, String worte) {
zahl = wert;
buchstaben = worte;
}
}


Mein JRuby Skript hat momentan folgenden Stand:


1
2
3
4
5
6
7
8
9
10

require 'java'
include_class(['java.lang.System'])
module JavaPaket
include_package 'SerialKlasse.Listenklasse'
end
liste = JavaPaket.Listenklasse.new(3, "test")
filename = "c:/ruby/daten.txt"
fr = java.io.FileInputStream.new filename
br = java.io.ObjectInputStream.new fr

Wenn ich das JRuby skript ausführe erhalte ich die Fehlermeldung
C:\>jruby C:\test\testwin.rb
C:\test\testwin.rb:16: undefined method `Listenklasse' for JavaPaket:Module (NoMethodError)

Die Java Klasse habe ich in ein Package gegeben das ich "SerialKlasse" genannt habe und die .class Datei heißt Listenklasse.class (die entsprechende .java datei liegt im selben Ordner bzw Package). Ich möchte ein Serialisiertes Objekt (die Klasse 'Listenklasse') aus einer Datei auslesen und wieder auf den Bildschirm ausgeben mit JRuby.
Ich arbeite mit einem WinXP System, habe Ruby 1.8.6, JRuby 1.0.1 und das JDK 1.5.0_05. Das JRuby Skript ist gespeichert im Ordner c:\test die Java Klasse 'Listenklasse.class' unter c:\test\SerialKlasse.
Mittlerweile habe ich so gut wie jedes Google Ergebnis mir angesehen aber fast nirgends ist etwas brauchbares dabei und wenn doch gibt es eben eine andere Fehlermeldung(ausser ich kommentiere die Syntax von Zeile 7 aus dann läuft es Problemlos durch):(
vielen Dank für eure Hilfe schon im vorraus:)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 11 Jun 2008, 14:17 
Offline
Metaprogrammierer

Registriert: 03 Feb 2008, 15:36
Beiträge: 682
Wohnort: Aachen, NRW



  liste = JavaPaket::Listenklasse.new(3, "test")

sollte dann doch klappen


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 11 Jun 2008, 14:28 
Offline
Lehrling

Registriert: 26 Mai 2008, 16:23
Beiträge: 52
leider nicht:(
C:\>jruby C:\test\testwin.rb
file:/C:/ruby/jruby-1.0.1/lib/jruby.jar!/builtin/javasupport/core_ext/module.rb:24:in`const_missing':uninitialized constant JavaPaket::Listenklasse (NameError) from C:\test\testwin.rb:7

so sieht mein JRuby Skript jetzt aus:



1
2
3
4
5
6
7
8
9
10

require 'java'
include_class(['java.lang.System'])
module JavaPaket
include_package 'SerialKlasse.Listenklasse'
end
liste = JavaPaket::Listenklasse.new(3, "test")
filename = "c:/ruby/daten.txt"
fr = java.io.FileInputStream.new filename
br = java.io.ObjectInputStream.new fr


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 23 Jun 2008, 10:58 
Offline
Lehrling

Registriert: 26 Mai 2008, 16:23
Beiträge: 52
keiner eine Lösung parat?
gibt es die möglichkeit das ich die Java Klasse nicht einbinden brauche in mein JRuby Skript und stattdessen eine Ruby Klasse erschaffe die die selbe Funktion hat wie die Java Klasse? Wenn ja wie bekomme ich die Serialisierten Daten richtig angezeigt? Als ich versuchte mit einer Ruby Klasse die Serialisierten Daten zu lesen erhielt ich nämlich nur einen hex Wert und mit dem kann ich nichts anfangen


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 24 Jun 2008, 01:27 
Offline
Schüler
Benutzeravatar

Registriert: 06 Sep 2007, 12:08
Beiträge: 48
Hallo.

Ich hab mich damit noch garnicht so beschäftigt.. das rächt sich.
Es geht hier wohl irgendwie um die CLASSPATH-Variable, die von JRuby selbst nochmal auf das lokale lib-Verzeichnis gesetzt wird. Hier hat mir die Insel jetzt auch nicht so die Erleuchtung gebracht, sonst ist die in Sachen Java aber echt Klasse (ist ja auch dick genug..).
Der einfachste Weg Java-Klassen aus JRuby heraus aufzurufen ohne sich um die Path-Sache kümmern zu müssen ist folglich der dem Programm zu folgen.
Hier mal als Beispiel ein Skript und die dazu gehörige Java-Klasse:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 require 'java'

# CLASSPATH: Zur Laufzeit steht dieser Klassenpfad in
# der Umgebungsvariable java.class.path.
puts java.lang.System.getProperty("java.class.path")

begin
cl = java.lang.Class.forName("world.BadJ")
rescue
puts 'oh, oh...'
end

bad = cl.newInstance
puts bad.square(4)


Die erste Ausgabe zeigt die aktuell gesetzten Pfade an; JRuby sucht hier nach den eigenen jar-Paketen. Wenn du jetzt deine Java Klasse 'kompilierst' und in einem (executable) Jar-Paket verpackst, steckst du die einfach in den lib Ordner.
Ich hatte es mit einer Klasse mit main-Methode versucht:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package world;

public class BadJ extends Thread{

public BadJ() throws InterruptedException{
System.out.println("Hello from Java!");
Thread.sleep(2000);
}

public int square(int x){
int res = x * x;
return res;
}

public static void main(String[] args) throws InterruptedException {
BadJ b = new BadJ();
b.start();
System.out.println("..and bye!");
Thread.sleep(2000);
}
}

Wenn ich die als Java-Programm aus der Kommandozeile öffne habe ich beide Ausgaben; in Verbindung mit dem JRuby-Skript nur die des Konstruktors aber dafür eine Methode mit Rückgabewert.
So wie ich das sehe macht NetBeans wenn es ein JRuby/Java-Kombi Jar-File exportiert ja eigentlich nichts anderes; auch hier hängt das gesammte JRuby-Complete.jar mit drin.

Ich hoffe der Tipp hilft dir; wenn du eine bessere Möglichkeit findest sag bescheid..

Ciao,
T. :)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 24 Jun 2008, 09:31 
Offline
Schüler
Benutzeravatar

Registriert: 06 Sep 2007, 12:08
Beiträge: 48
P.S.:

Wenn du dein Jar-Paket in das lib-Verzeichnis legst geht natürlich auch:


1
2
3
require 'java'
include_class "world.BadJ"
bad = BadJ.new


Dein include_package geht bei mir allerdings nicht; bin auf JRuby 1.0.2...


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 24 Jun 2008, 13:09 
Offline
Lehrling

Registriert: 26 Mai 2008, 16:23
Beiträge: 52
Hallo
danke dandaylion du hast mir sehr weiter geholfen.
das include_package geht bei mir auch nur insoweit das es nicht als Fehler erkannt wird aber was machen damit kann ich auch nicht gerade da dann eben folgefehler kommen (Klasse nicht bekannt und so).

Ich habe jetzt versucht dein Beispiel auf mein Problem zu übertragen und bin da jetzt bei folgendem Code für mein JRuby Skript:



1
2
3
4
5
6
7
8
9
10
require 'java'

puts java.lang.System.getProperty("java.class.path")
begin
cl = java.lang.Class.forName("SerialKlasse.Listenklasse")
rescue
puts "oh oh"
end
jop = cl.newInstance(0, "strin")
puts jop.Listenklasse


die Java Klasse habe ich in einem Jar verpackt und in das lib verzeichnis kopiert ansonsten habe ich nichts verändert an dieser Klasse.

Das Problem das jetzt auftritt bei mir ist folgendes:
:1: wrong # of arguments(3 for 1) (ArgumentError)
und ich sag ganz ehrlich, ich bin irritiert. In meiner Java Klasse erwarte ich 2 Argumente die übergeben werden müssen, die ich bei der Instanzierung auch mitgebe aber wie kommt JRuby auf "3 for 1" und wo liegt mein fehler?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 24 Jun 2008, 15:20 
Offline
Schüler
Benutzeravatar

Registriert: 06 Sep 2007, 12:08
Beiträge: 48
Hi!

Ja, also dann versuch es doch jetzt nochmal so wie am Anfang:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require 'java'

=begin
puts java.lang.System.getProperty("java.class.path")
begin
cl = java.lang.Class.forName("Serialklasse.Listenklasse")
rescue
puts "oh oh"
end
jop = cl.newInstance(0, "strin")
puts jop.Listenklasse
=end


include_class "Serialklasse.Listenklasse"

Listenklasse.new(0,"strin")

Bei mir klappt es dann so mit deiner Java-Klasse. Kann sein, dass mein 'Pfusch-Versuch' mit der Class.forName Geschichte das nicht nimmt; da gibt es dann noch so was wie getConstructor oder so...
In Sachen Reflektion ist Java da sehr viel imständlicher als Ruby.
Aber so Sachen wie Methoden, Instanzmethoden, u.ä. abfragen klappt so weit ich das beurteilen kann auch mit importierten Java Klassen.

Oh, ich seh gerade: bin da etwas durcheinander gekommen mit Groß- und Klein CamelCase-Schreibweise,... nicht Copy&Paste'n !!!


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 24 Jun 2008, 15:52 
Offline
Lehrling

Registriert: 26 Mai 2008, 16:23
Beiträge: 52
ok, vielen herzlichen dank das funktioniert:)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 24 Jun 2008, 17:03 
Offline
Schüler
Benutzeravatar

Registriert: 06 Sep 2007, 12:08
Beiträge: 48
Jo.

Hier jetzt mal ein komplettes Beispiel mit deiner Klasse und Serialisierung von Java - Objekten unter JRuby (nur der Vollständigkeit halber):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  require 'pp'
require 'java'


include_class "Serialklasse.Listenklasse"


liste = Listenklasse.new(0,"strin")

filename = "c:/daten.txt"

fos = java.io.FileOutputStream.new filename
oos = java.io.ObjectOutputStream.new fos
oos.writeObject(liste)
oos.close
fos.close

puts "Wait for any pressed key......"
gets

fis = java.io.FileInputStream.new filename
ois = java.io.ObjectInputStream.new fis
back_again = ois.readObject
ois.close
fis.close

pp back_again

Na, das hat sich ja mal gelohnt sich das mal anzugucken. Es ist also wirklich kein Problem eigene Java-Klassen einzubinden und zu nutzen (was man so noch alles skripten könnte...).

Markierst du den Thread noch als gelöst?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Jun 2008, 16:17 
Offline
Lehrling

Registriert: 26 Mai 2008, 16:23
Beiträge: 52
ja mach ich:) und nochmals vielen Dank


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 22 Okt 2008, 07:26 
Offline
Geselle

Registriert: 25 Okt 2007, 14:53
Beiträge: 145
Hallo,
leider kann ich nicht auf Java Klassen zugreifen. Habe hier ein viewtopic.php?t=8226 neuen Post geöffnet.

Viele Grüsse

UPDATE: Könntest du bitte beschreiben wie du (executable) Jar-Paket erstellst hast.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: