Liebe Studierende,
die Gruppe 2 versucht, e-Mail über eine Java-Klassenbibliothek namens "Java Mail" [1], [2] aus "Java EE" [2] zu versenden. Die e-Mailklassen aus dieser Klassenbibliothek beginnen alle mit dem Namensraum "javax." (Top-level Paketname).
Die Spezifikationen der "enterprise edition (EE)" werden von der
Open-source-Gemeinschaft "Eclipse Foundation" weiterentwickelt.
Oracle USA besteht aber darauf, dass der Namensraum nicht mit
"javax." mehr beginnen darf (wie auch, dass niemand den Namensraum
"java." verwendet), da dies ein für Oracle geschützter Namen wäre;
niemand möchte sich juristisch mit Oracle anlegen, sodass die
Eclipse Foundation für die neuen Spezifikationen den Namensraum
"jakarta." verwendet. "Jakarta" war in der Apache Software
Foundation (ASF) ursprünglich die Bezeichnung für Java-bezogene
Projekte und die ASF hat der Eclipse Foundation die Nutzung des
Namens überlasen. "Java EE" wird daher durch "Jakarta EE" [4]
abgelöst.
Das "Java Mail"-Paket heißt nunmehr "Jakarta Mail" [5], die Java-Klassenbibliothek [2] wurde unter Eclipse weiterentwickelt und kann in der Version 1.6.5 unter [6] heruntergeladen werden.
Während der Übergangszeit von "Java EE" auf "Jakarta EE" ist es
daher immer wichtig für Softwareentwickler zu wissen, welches
Mailpaket man verwendet, denn davon hängt ab, ob die
Mail-Javaklassen mit dem Paketnamen "javax" (z.B.
"javax.mail.Session") oder mit "jakarta" (z.B.
"jakarta.mail.Session") beginnen.
Der "Namespace" ist daher das erste Problem, dessen man sich bewusst sein muss, wenn man das Mailpaket der "Enterprise Edition (EE)" verwendet. (Dasselbe gilt im übrigen für Java-basierte Webserver.)
---
Das zweite Problem im Zusammenhang mit dem EE-Mailpaket ist, dass die Klasse "javax.mail.Authenticator" bzw. das neuere Pendant "jakarta.mail.Authenticator" ein wenig eigenartig konzipiert wurde: es ist eine abstrakte Java-Klasse, die trotzdem alle Methoden konkret implementiert, allerdings mit der Java-Sichtbarkeit "protected", statt mit "public". Daher kann man nicht direkt auf diese Methoden zugreifen, sondern muss eine Java-Subklasse bilden, aus der man auf diese Methoden dann doch wieder zugreifen darf: man muss dabei die Methode "getPasswordAuthentication()" als öffentliche Methode implementieren. (Ziemlich unverständlich, aber so ist es nun einmal definiert worden.)
Normalerweise würde man in BSF4ooRexx für eine abstrakte Javaklasse einfach eine ooRexxklasse definieren, die die abstrakten Methoden in ooRexx implementiert, eine Rexxinstanz dann daraus erzeugen und mit BsfCreateRexxProxy(rexxObject,,"name.der.abstrakten.Javaklasse") dafür sorgen, dass im Hintergrund eine entsprechende Javaklasse automatisch erzeugt wird, in der die abstrakten Methoden dazu führen, dass das Rexxobjekt entsprechende Nachrichten mit entsprechenden Java-Argumenten geschickt erhält. Dies funktioniert aber bei der Klasse "javax|jakarta.mail.Authenticator" nicht, weil trotz der Tatsache, dass diese Klasse als abstrakte Java-Klasse definiert ist, es keine Java-Methoden gibt, die als "abstract" markiert sind!
Aus diesem Grund muss man in BSF4ooRexx zunächst eine "Proxy"-Javaklasse erzeugen, was mit der Routine "bsf.createProxyClass()" (vgl. auch das BSF4ooRexx-Beispiel "samples\3-010_clock.rxj") möglich ist (in BSF.CLS definiert). Hierbei kann eine beliebige (auch eine konkrete) Java-Klasse angegeben werden und eine kommaseparierte Liste von Methoden darin, die in einer ooRexx-Klasse implementiert sind. Dies geschieht mit:
jfclz=bsf.createProxyClass("javax.mail.Authenticator", , "getPasswordAuthentication")
Die Java-Klasse, die retourniert wird, erwartet sich als erstes Argument ein RexxProxy, das man einfach mit BsfCreateRexxProxy(rexxObjekt) erzeugen kann.
---
Das dritte Problem: ich habe Ihnen eine Lösung geschickt, die
sehr flexibel ist, in ooRexx mit "requires" eingebunden werden
kann und deren öffentliche Routine "sendMailSSL" man beliebig oft
anschließend aufrufen kann. Dabei wird automatisch beim
erstmaligen Laden festgestellt, ob das installierte EE-Mailpaket
für den Namensraum "javax" oder "jakarta" konzipiert war, der dann
entsprechend beim Laden der Javaklassen verwendet wird. Es wird
zudem ein Feature von ooRexx verwendet, das ich Ihnen nicht
vermittelt habe, nämlich die lokale Umgebung des Pakets (des
Rexxprogramms) selbst, auf das man mit ".context~package~local"
Zugriff erhält: es handelt sich dabei um ein Directory-Objekt. Es
ist dies das erste Umgebungsobjekt, das der ooRexx-Interpreter
aufsucht, wenn er im Rexxprogramm ein Umgebungssymbol (die
beginnen immer mit einem Punkt) findet und auflöst (der erste
Punkt wird ignoriert, das verbleibende Symbol in Großbuchstaben
wird als Index in einem der Umgebungsdirectories gesucht).
---
Das vierte Problem: damit man auf die EE-Mailklassen zugreifen kann, muss die entsprechende jar-Datei in die CLASSPATH-Umgebungsvariable *vor* dem Start des Programms aufgenommen werden, damit Java Klassen darin überhaupt finden kann. Das gilt für reine Javaprogramme wie auch für Rexxprogramme!
Hier eine Anleitung, wie man das unter Windows für "Java EE Mail" (Namensraum "javax.") schafft, d.h. Sie haben die jar-Datei "javax.mail.jar" [2] in dasselbe Verzeichnis wie das Programm gespeichert:
- Kommandozeile öffnen, in das Verzeichnis mit dem Programm wechseln und folgendes eingeben:
set CLASSPATH=%CLASSPATH%;%cd%\javax.mail.jar
Anschließend das Programm erfolgreich laufen lassen. :)
Anbei finden Sie folgende drei Programme:
Wenn Sie hier Fragen haben, dann scheuen Sie sich nicht, diese zu stellen! :)
Der Gruppe 2 viel Erfolg für das Abschließen des Projekts!
Mit freundlichem Gruß
Rony G. Flatscher
[1] "Java Mail (Java EE, namespace "javax."), Homepage: <https://javaee.github.io/javamail/>
[2] "Java Mail-Klassenbibliothek", Downloadlink, Version 1.6.2, Stand: 29.8.2018: <https://github.com/javaee/javamail/releases/download/JAVAMAIL-1_6_2/javax.mail.jar>
[3] <https://de.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition>
[4] <https://en.wikipedia.org/wiki/Jakarta_EE>
[5] "Jakarta Mail (Jakarta EE, namespace "jakarta.", homepage: <https://eclipse-ee4j.github.io/mail/>
[6] "Java Mail-Klassenbibliothek", Downloadlink, Version 1.6.5,
Stand: 10.3.2020:
"https://repo1.maven.org/maven2/com/sun/mail/jakarta.mail/1.6.5/jakarta.mail-1.6.5.jar"
-- __________________________________________________________________________________ Prof. Dr. Rony G. Flatscher Department Wirtschaftsinformatik und Operations Management Institut für Wirtschaftsinformatik und Gesellschaft D2c 2.086 WU Wien Welthandelsplatz 1 A-1020 Wien/Vienna, Austria/Europe http://www.wu.ac.at __________________________________________________________________________________