Forum: PC-Programmierung Kennt sich hier jemand mit "Groovy" aus?


von Frank E. (Firma: Q3) (qualidat)


Angehängte Dateien:

Lesenswert?

Für die Datenbanksoftware Filemaker Pro gibt es ein Plugin, das eine 
Schnittstelle bereitstellt, so dass man eigene Funktionen in "Groovy" 
verfassen kann. Groovy stammt von Apache und soll zum überwiegenden Teil 
mit Java komaptibel sein. Mein ersten Versuche werfen allerdings eine 
Fehlermeldung (s. Bild) , die mich fast wahnsinnig macht, weil ich sie 
nicht verstehe. Vlt. könnte mal jmd. einen Blick darüber werfen? Danke.

Die Funktion RegisterGroovy "außenrum" gehört zu Filemaker und 
deklariert diesem gegenüber die selbstverfasste Methode. Der restliche 
Java-Code beruht auf einem Beispiel für einen QR-Code-Generator auf 
Basis des ZXing-Projektes. In Eclipse mit "richtigem" Java läuft das 
problemlos ...
1
RegisterGroovy("get_qrcode(text;s)" ;
2
"
3
import java.awt.image.BufferedImage;
4
import com.google.zxing.BarcodeFormat;
5
import com.google.zxing.common.BitMatrix;
6
import com.google.zxing.qrcode.QRCodeWriter;
7
8
public BufferedImage getQR(String t,int size) throws Exception{
9
QRCodeWriter qrw = new QRCodeWriter();
10
BitMatrix btm = qrw.encode(t,BarcodeFormat.QR_CODE,size,size);
11
return MatrixToImageWriter.toBufferedImage(btm);}
12
13
return getQR(text,s.toInteger());
14
15
")

von sid (Gast)


Lesenswert?

groovy =/= Java

Du kannst nicht javacode in einer groovy umgebung schreiben und erwarten 
dass es pauschal funktioniert.
auch wenn die Syntax sehr ähnlich ist
(und damit eine 'flache Lernkurve' ür Java Entwickler bietet, ist es 
eben noch lange kein JAVA!)
Und ja ich weiss, dutzende von java imports geschehen automatisch.
Heisst aber eben nicht zwingend das googles zebraCrossing mit groovy 
kompatibel ist.
(ich weiss es nicht, ich nutze groovy nicht selber)
ich empfehle da mal
https://groovy-lang.org/differences.html
als Lektüre.
kann sein, dass zebracrossing zB arrays in java shorthand initialisiert, 
was in groovy schlicht nicht funktioniert.
müssteste mal reinsehen im Zweifel.

soweit ich das erkenne beschwert sich die Fehlermeldung über
den MatrixToImageWriter (der ist ja Teil von zxing nicht wahr?)

Ich empfehle übrigens, Java-syntax in groovy zu 'vermeiden'
zb ist das letzte 'return' einer Funktion in groovy optional
ebenso semikolons sie sind IMMER optional
etc..
am besten Du liest dich mal kurz durch den style guide:
https://groovy-lang.org/style-guide.html

Empfehle ich deswegen,
weil Du so code-snippets anhand der Syntax unterscheiden kannst
falls Du sie auslagerst und weiter/wieder-verwenden willst.
Das erspart Dir nämlich grovvy-spezifischen Code in Java und 
Andersherum.
eben für die Fälle wo die zwei mal grade NICHT kompatibel sind.
Aber das nur als gut gemeinter Rat (funktioniert ja mit semikolons und 
return auch ;))

'sid

von 🐧 DPA 🐧 (Gast)


Lesenswert?

sid schrieb:
> Heisst aber eben nicht zwingend das googles zebraCrossing mit groovy
> kompatibel ist.
> (ich weiss es nicht, ich nutze groovy nicht selber)
> ich empfehle da mal
> https://groovy-lang.org/differences.html
> als Lektüre.
> kann sein, dass zebracrossing zB arrays in java shorthand initialisiert,
> was in groovy schlicht nicht funktioniert.

Das halte ich für unwahrscheinlich. Ich würde mal annehmen, dass java 
code (in .java Dateien) als java code, und groovy code (in .groovy) als 
groovy code kompiliert wird. Resultat ist jeweils java byte code in 
.class files, und Dinge wie das Format der Funktionstabellen, Calling 
Conventions, importieren anderer .class Files, etc. ist mit dem Format 
der .class files klar definiert. Dort sind nicht nur Maschinencode 
Instruktionen drin, und beim Kompilieren einer Quelldateien braucht es 
die anderen importierten noch nicht, erst bei der Ausführung müssen alle 
.class Files da sein. Und verschiedene Sprachen können das Zeug im 
.class file auch nicht einfach anders machen, weil dann kann die JVM mit 
dem zeug schlicht nichts mehr anfangen.

Von da her ist es eigentlich nicht möglich, dass eine Java Library 
aufgrund von Syntaxunterscheiden zwischen groovie und java zu groovie 
inkompatibel ist, denn auf der Ebene interagieren die Sprachen ja gar 
nie.

Was das eigentliche Problem sein könnte, kann ich aber auch nicht sagen.
Hast du schon versucht, die getQR Funktion wegzulassen, und den Code 
darin direkt ausführen zu lassen? Wer weiss, was RegisterGroovy mit dem 
Code anstellt, vielleicht wrappt dass den Code schon in eine Methode?

von sid (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Von da her ist es eigentlich nicht möglich, dass eine Java Library
> aufgrund von Syntaxunterscheiden zwischen groovie und java zu groovie
> inkompatibel ist

bist Du sicher? Ich weiss es nicht, wie gesagt ich nutze groovy nicht 
wirklich;
da sich Java aber sowohl als compiletime als auch als runtime 
kompilieren lässt (zwecks portabilität und so)
weiss ich nicht inwiefern sich ein classfile nicht eventuell doch als 
"halbzeug" verhält also quasi unfertig daherkommt;
ich hab mich da ehrlich gesagt nie wirklich drum geschert
(bin jetzt auch schon nicht der grosse fan von Java muss ich gestehen)

Wie gesagt ich weiss es nicht,
würde aber -wegen besagter feiner Unterschiede- eben nicht pauschal 
davon ausgehen,
dass alles was in Java funktioniert auch in groovy läuft
(sonst wär's ja auch irgendwie unnütz überhaupt zu unterscheiden ;))

JDF wie Frank schon richtig bemerkt hat ist der JAVA-code ansich okay.
das kompiliert und tut wie ihm geheissen,
und wenn ich das richtig gezählt habe klemmt er eben beim Aufruf von 
MatrixToImageWriter;
das kann allerdings auch ne Unzulänglichkeit des Scriptmaster plugins 
sein
der es als "einzeiler" liesst und sich dann irgendeine column der Zeile 
ausdenkt #schulterzuck

Tut mir leid, ich fürchte ich kann also nicht wirklich helfen :(

'sid

von 🐧 DPA 🐧 (Gast)


Lesenswert?

sid schrieb:
> bist Du sicher?

Ja

> Ich weiss es nicht, wie gesagt ich nutze groovy nicht wirklich;

Ich auch nicht.

> da sich Java aber sowohl als compiletime als auch als runtime
> kompilieren lässt (zwecks portabilität und so)
> weiss ich nicht inwiefern sich ein classfile nicht eventuell doch als
> "halbzeug" verhält also quasi unfertig daherkommt;

Es gibt ne spec, da kann man es nachlesen: 
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

Methoden, Interfaces, Felder, Konstanten, Datentypen, aber auch die 
Opcodes der Instruktionen, etc. sind alle genau festgelegt, wie sie 
binär repräsentiert werden. Da drin ist nichts Java-  Groovie-  etc. 
spezifisches mehr drin.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

🐧 DPA 🐧 schrieb:

> Was das eigentliche Problem sein könnte, kann ich aber auch nicht sagen.
> Hast du schon versucht, die getQR Funktion wegzulassen, und den Code
> darin direkt ausführen zu lassen? Wer weiss, was RegisterGroovy mit dem
> Code anstellt, vielleicht wrappt dass den Code schon in eine Methode?

Ja, das hab ich auch schon probiert, das führte zu einer anderen 
Fehlermeldung ... kann ich erst heute abend reinstellen, bin z.Zt. 
unterwegs, irgendwas mit "... missing property ..."

Durch das Kapseln verschwand diese Meldung.

von Frank E. (Firma: Q3) (qualidat)


Angehängte Dateien:

Lesenswert?

So, der Code ohne die Kapselung in einer Methode sieht so aus:
1
RegisterGroovy("get_qrcode(text;s)" ;
2
"
3
import java.awt.image.BufferedImage;
4
import com.google.zxing.BarcodeFormat;
5
import com.google.zxing.common.BitMatrix;
6
import com.google.zxing.qrcode.QRCodeWriter;
7
8
QRCodeWriter qrw = new QRCodeWriter();
9
BitMatrix btm = qrw.encode(text,BarcodeFormat.QR_CODE,s.toInteger(),s.toInteger());
10
BufferedImage img = MatrixToImageWriter.toBufferedImage(btm);
11
return img;
12
")

Die Fehlermeldung ist im Bild zu sehen. :-(

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Das ist doch schon mal ein Fortschritt, ein Runtime statt ein Compile 
time Fehler. Es scheint als würde er MatrixToImageWriter nicht finden.
Versuch mal einen Import dazu zu tun, vermutlich:
1
import com.google.zxing.client.j2se.MatrixToImageWriter;

Ich hab noch das hier gefunden, vermutlich aber noch nicht relevant: 
https://stackoverflow.com/questions/23054607/is-the-j2se-com-google-zxing-client-j2se-matrixtoimagewriter-still-the-standard

von Frank E. (Firma: Q3) (qualidat)


Angehängte Dateien:

Lesenswert?

🐧 DPA 🐧 schrieb:
> Das ist doch schon mal ein Fortschritt, ein Runtime statt ein Compile
> time Fehler. Es scheint als würde er MatrixToImageWriter nicht finden.
> Versuch mal einen Import dazu zu tun, vermutlich:
>
1
> import com.google.zxing.client.j2se.MatrixToImageWriter;
2
>

Uff. Super! Genau das wars. Mein Dank wird dir ewig nachschleichen :-)

Nornalerweise steht da in so einem Fall "not resolved ..." :-( aber gut, 
einem geschenkten Barsch ... :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.