- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Isolated Module: Server-Mode vs Module-Mode
Moin,
eigentlich hรคtte ich ja gedacht, dass ich im Isolated Mode eines Moduls die Nutzung von Bibliotheken verstecken kann. Dies funktioniert aber nicht, wenn diese Bibliotheken im Modul selbst genutzt werden, dessen Klassen auf server-Ebene liegen.
Hintergrund: Ich mรถchte Utility-Klassen bereitstellen, die ich bspw. in Auftrags-Aktionen nutzen kann. Dafรผr muss die Modul-Bibliothek im server-Mode bereitgestellt werden, weil die Klassen sonst nicht sichtbar sind. Nun benutze ich auch eine commons-Bibliothek in den Utilities. Die (externe) Bibliothek mรถchte ich natรผrlich nicht auf server-Mode stellen. Das geht aber nicht (und der FSM-Checker meckert auch entsprechend).
Wie sieht eine gute Alternative aus? Gibt es einen praktischen oder pragmatischen Ansatz, um solche Klassen bereitzustellen oder mรผssen dann alle genutzten Libraries auch auf server-Mode stehen? Wรผrde ja ein wenig dem Isolated Gedanken widersprechen. Warum findet der Classloader der Modulbibliothek die (Modul-internen) module-Mode-Libraries nicht? Oder รผbersehe ich die einfache Lรถsung?
Danke fรผr eure Gedanken
Stefan
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
eigentlich hรคtte ich ja gedacht, dass ich im Isolated Mode eines Moduls die Nutzung von Bibliotheken verstecken kann.
Die eigentliche Intention des Isolated Mode ist, die vom FirstSpirit-Server mitgelieferten Jars von den Klassen der Module zu isolieren. Ansonsten wรคren รnderungen an den internen Bibliotheken nur mit hohem Risiko mรถglich, da sich die Module womรถglich auf bestimmte Versionen verlassen. Durch die Isolierung kann jedes Modul die Librarys in den Versionen mitbringen, die es selbst benรถtigt.
Hintergrund: Ich mรถchte Utility-Klassen bereitstellen, die ich bspw. in Auftrags-Aktionen nutzen kann. Dafรผr muss die Modul-Bibliothek im server-Mode bereitgestellt werden, weil die Klassen sonst nicht sichtbar sind. Nun benutze ich auch eine commons-Bibliothek in den Utilities. Die (externe) Bibliothek mรถchte ich natรผrlich nicht auf server-Mode stellen. Das geht aber nicht (und der FSM-Checker meckert auch entsprechend).
Das ist soweit auch erst einmal richtig. Allerdings ist die Sichtbarkeit der Classloader eine andere: Modul-lokale Classloader haben Zugriff auf alle globalen Ressourcen von allen Modulen, die wiederum den Runtime-Classloader von FirstSpirit "sehen" kรถnnen. Die Richtung von Server-Scope nach Module-Scope ist nicht mรถglich. Hier das Zitat aus der Dokumentation:
"Es gilt: Klassen aus global-definierten Jars kรถnnen keine Klassen aus modul-lokal definierten Jars benutzen. Der umgekehrte Weg ist jedoch mรถglich."
Ganz generell ist die Empfehlung, auf globale Ressourcen soweit wie mรถglich zu verzichten, vor allem wenn es sich um hรคufig genutzte Komponenten (wie in diesem Fall Apache Commons) handelt.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Stephan,
grundsรคtzlich ist mir das alles schon klar. Eigentlich ist meine Frage eher, wie eine Lรถsung der Problematik aussehen kรถnnte. Und wieso der Classloader bei Server-Level Klassen eines Moduls nicht auch den eigenen Modul-Classloader erreichen kรถnnen sollte. Thommy hat mir das damals bestimmt alles schon einmal erklรคrt ๐
Man mรถchte fรผr seine (Utility-)Klassen doch auch keinen Client-Service-Mechanismus aufsetzen mรผssen, um eine ordentliche Trennung hinzubekommen. ๐ค
Kรถnnte man alternativ nicht in FirstSpirit die in einem Modul als "Public" deklarierten Klassen automatisch global als eine Art Proxy bereitstellen und so komplett auf Server-Scope verzichten?
Besten Dank fรผr deine Geduld und Hilfe,
Stefan
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Das Problem ist hier die Transitivitรคt der Classloader. Wenn globale Classloader Zugriff auf ihre "eigenen" Modul-Classloader haben, die aber wiederum Zugriff auf alle globalen Ressourcen, wรคre die Isolierung der Module untereinander nicht mehr gegeben.
Utility-Klassen in den globalen Scope zu schieben mag eine naheliegende Idee sein, ist mit der Classloader-Hierarchie aber problematisch. Besser wรคre es z.B., die Klassen in einzelne Jar-Artefakte zu verpacken, die dann von den jeweiligen Modulen im lokalen Classloader mitgebracht werden.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hm. Entweder habe ich den letzten Absatz nicht verstanden oder wir reden von unterschiedlichen Dingen. ๐
Mit Utility-Klassen meine ich Funktionscontainer, die ich in Auftragsaktionen oder Vorlagen nutze, um komplexe Skripte zu vermeiden bzw. um der "Executable-Schwemme" zu entgehen.
Und anscheinend stimmt dann die Dokumentation fรผr Public Klassen auch nicht (mehr?), denn dort steht ja: "Public-Komponenten sind immer server-weit sichtbar, d.h. sie stehen nach der Installation auf dem Server, im Client, in Scripten und anderen Modulen ohne weitere Aktivierung zur Verfรผgung". Fรผr Executables scheint dies ja zu funktionieren. Zumindest laut Doku: "Eine ausfรผhrbare Implementierung kann auch referenziert werden, wenn die Klasse in einem modul-lokalen Jar-Archiv liegt". Kann aber auch sein, dass ich das falsch lese.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Stefan,
die von dir verlinkte Doku spricht von Komponenten. Das ist nicht gleichbedeutend mit Klassen. Am Beispiel von Executables: Die sind รผber #!executable-class als Komponente zwar nutzbar, auch wenn (was ja auch in der Doku unter โGรผltigkeitsbereichโ erklรคrt bzw. empfohlen wird) ihre Klassen im module-Scope liegen.
Mit โausfรผhrbare Implementierungโ sind hier schlicht Executables gemeint.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sorry, da gab es wirklich ein Missverstรคndnis. Fรผr mich sind "Utility-Klassen" solche, die aus Bequemlichkeit einmal geschrieben werden, um sie dann an verschiedenen Orten (oder in verschiedenen Projekten) zu nutzen, wie etwa ein StringUtil.
Die Verwirrung mit den Executables kommt wohl daher, dass mit "server-weit sichtbar" nicht gemeint ist, dass die gewรผnschten Klassen im Server-Scope liegen mรผssen. Executables laufen (wie auch Upload-Hooks) vollstรคndig auf dem FirstSpirit-Server in einer Umgebung wie dem FS-Server oder dem SiteArchitect, die den passenden lokalen Modul-Classloader fรผr die Ausfรผhrung selbst auswรคhlen kann.
Ein Gegenbeispiel wรคre ein Service: Dieser kann auch von einem (Web-)Client aus aufgerufen werden. Da es im Application-Server (z.B. Tomcat) aber nur einen Classloader gibt, der nicht unter unserer Kontrolle steht, kann hier jede Klasse nur in einer einzigen Version geladen werden: Die Version, welche durch den globalen FirstSpirit-Classloader vorgegeben ist. Daher sollte ein Service nur das eigene Interface auf den Server-Scope legen, die gesamte Implementierung kann im Modul-Scope geschehen. Vorsicht ist hier nur geboten bei der Definition von Methodenparametern und Rรผckgabewerten, diese sollten idealerweise aus dem JDK kommen.

