Viele JARs und deren Resourcen

KrokoDiehl

Top Contributor
Hallo zusammen.
Ich habe aktuell ein Problem bzw. Klärungsbedarf, bei dem ich mal Rat und Meinungen brauche.
Folgende Situation:
Wir haben mehrere kleinere Anwendungen die als JAR vorliegen und in eine größere Anwendung integriert werden. Das läuft soweit.
Problematisch ist nun der Punkt Resourcen. Ich rede hier mal nur von Bildern, aber es bezieht sich auch auf andere. Wir haben derzeit folgende Struktur in den einzelnen JARs:
Code:
app1.jar
   -- package1
       -- package21 
       -- package22
       -- ...
   -- resources
       -- icons.properties
       -- (andere properties)
       -- icons
           -- ok.png
           -- cancel.png
           -- (usw)
Damit werden über
Code:
ResourceBundle.getBundle("resources/icons")
die Properties geladen und über die ClassLoader analog die Icons.
Das läuft bei den einzelnen Anwendungsteilen super.
Wenn nun aber das große Programm kommt und die ganzen kleineren JARs lädt, dann überschreiben/-schneiden sich offenbar (und logischerweise) die /resourcen-Verzeichnisse, da hier die Namen und die Struktur in allen JARs gleich ist.

Nun meine Frage: Gibt es einen Weg das zu umgehen oder es besser zu lösen? Ich habe mit ClassLoadern bisher nur wenig gemacht und nehme z.B. stets
Code:
this.getClass().getClassLoader()
, aber vielleicht gibt es hier schon eine andere Möglichkeit, die pro JAR unterscheidet. Dann bliebe halt noch der Aufruf zum Laden von "resources/icons", welches es im Verbund dann auch mehrmals gibt. Ganz zu schweigen davon, wenn es mehrmals die Datei ok.png gibt :)

Von anderen Stelle habe ich gehört, dass sie extra ein JAR mit Resourcen gemacht haben, wo eben alle drin sind. Dies wäre auch eine Option, aber dann müsste ich bei jedem kleinen Anwendungsteil (der auch separat verwendet werden kann), das dicke JAR mit allen Grafiken/Resourcen mitführen, von denen 80% niemals verwendet werden.

Weitere Alternative: Die Gleichheit der Namensgebung irgendwie auflösen... dann müssten aber ziemlich viele Projekte angepasst werden *autsch*.

Also brainstormt mal :) Vielleicht bin ich auch auf dem Holzweg.
Danke im Voraus.
 

Michael...

Top Contributor
Zu Deinem Problem wüsste ich momentan keine Lösung...

Eventuell gibt's eine Möglichkeit mit eigenen ClassLoadern für jedes jar, aber dazu kenne ich mich zu wenig mit dem Thema aus.

... aber ich hätte einen Klugscheisserhinweis ;-)
Wehret den Anfängen --> Resourcen vernünftig in die package Struktur einbinden
 

Empire Phoenix

Top Contributor
Jao das Problem wenn man sich bei Packages nicht an naming conventions hält... Eine saubere Lösung ist nur alle kleinen anwendungen in ein einzelnes package zu packen.
 

FArt

Top Contributor
Du kannst zur Laufzeit für jedes Jar mit Ressourcen (das sollte vorher natürlich noch nicht im Klassenpfad sein) einen eigenen UrlClassloader definieren und über den dann die Ressourcen aus einem JAR laden. Dazu ist es u.U. nicht sehr praktisch, wenn Klassen und Ressourcen vermischt werden.

Prinzipiell ist es nicht gut, wenn verschiedene Ressourcen unter der gleichen URI über den Klassenpfad zu laden sind. In der Regel ist das ein ungünstiges (schlechtes) Assembly der Applikation.
 

KrokoDiehl

Top Contributor
Gut, das Thema "Umstrukturieren der Resourcen" will ich nicht ganz abtun. Lieber einmal die Mühe noch reinstecken solange es noch geht :)
Um mal Größen zu nennen, so haben die bisherigen Anwendüngchen zwischen 10 und 20 Icons und 2-3 properties (pro Locale, was aktuell aber nur eine ist...).

Was wäre denn ein ordentliche Struktur? Ich würde nun sagen jene:
Code:
com/firma/app1/(sourcen)
com/firma.app1/resources/blabla.properties
com/firma.app1/resources/icons/ok.png
com/firma.app1/resources/icons/cancel.png
(...)
D.h. die bisherige /resources-Struktur soweit nach hinten schieben, bis sie im Package mit der Teilanwendung landet. Damit hätte man die Namenseindeutigkeit. Oder irre ich?

Worin ich jedenfalls keinen Sinn sehe, ist die Resourcen soweit aufzuteilen, dass sie "neben" den Klassen liegen, sprich etwas à la
Code:
com/firma/app1/gui/win/MyDialog.class
com/firma/app1/gui/win/MyDialog.properties
com/firma/app1/gui/win/ok.png
com/firma/app1/gui/win/cancel.png
com/firma/app1/gui/views/MyView.class
com/firma/app1/gui/views/MyView.properties
com/firma/app1/gui/views/ok.png
com/firma/app1/gui/views/cancel.png
(...)
Mal abgesehen davon, dass ich das meinen Chefs wirklich gut erklären müsste, hat man hier ja eine maximale Streuung... Ich bin doch dafür die Resourcen auch räumlich beisammen zu halten.

Aber sagt ruhig, was der rechte Weg laut Theorie ist, oder worin ihr Vor- und Nachteile seht. Wäre die hier genannte erste Option eine Lösung für mein Problem oder stoße ich danach auf weitere?

Und danke schonmal :)
 

FArt

Top Contributor
Mit vermischen meinte ich: Klassen und Ressourcen in einem JAR, wie es in deinem Beispiel oben gemacht ist. Es wäre u.U. sinnvoller die Ressourcen in ein extra JAR zu packen.

Warum müssen die Ressourcen von verschiedenen Applikationen in ein JAR (oder zumindest in einen Klassenpfad)???
 

KrokoDiehl

Top Contributor
Also es ist schonmal kein Plugin-System im eigentlichen Sinne. Die Historie ist, dass es einige kleinere Anwendungen gibt (im Hausgebrauch "Tools" genannt), die an-und-für-sich auch eigenständige Anwendungen bleiben (die meisten sind noch C/C++ basiert). Das istzB ein Tool mit dem man sich ein paar benutzerbezogene Daten aus einer DB holen kann, ein Tool mit dem man Einstellungen und Konfigurationen editieren kann... usw.
All diese kleinen Tools haben natürlich auch eigene Icons, bzw. können u.U. eigene Icons (bzw. Resourcen generell haben).

Nun gibt es u.A. das Vorhaben diese Tools auch in eine Gesamtanwendung zu integrieren ...ja, hier sieht es schon nach Plugins aus... aber dennoch die Möglichkeit zu behalten, dass sie selbstständig lauffähig und auslieferbar sind.

Von daher sage ich zu
maki hat gesagt.:
Irgenwie klingt das als ob ein Modul- bzw. Pluginsystem fehlt
mal "ja, so kann man das nennen" :)
Das System bisher war, dass jedes (bisher in Java realisierte) Tool eben das /resources-Paket hat. Das wurde mal so festgelegt, weil man dann sagen kann, dass alle Tools zumindest darin ähneln. Natürlich entsteht damit das genannte Problem beim Integrieren mehrerer Tools ...das fiel mir nun dieser Tage auf.
Sprich hier muss was getan werden:

a) Das Resourcen-System überarbeiten, oder
b) das Integrieren dieser Tools anders regeln (...was bisher als der klar unsaubere Weg scheint).

Nun geht's mir eben darum, was denn eine saubere Handhabe der Resourcen wäre?
FArt's Idee mit einer extra JAR mit allen Resourcen habe ich auch schon von anderen gehört. Scheint mir auch prinzipiell sinnvoll, nur für unseren Fall hinderlich, da es bedeuten würde, dass jedes Tool, wenn es eigenständig verwendet wird, das dicke JAR mit allen Resourcen (von denen es nur einen Teil braucht) zu verwenden.
Daher tendiere ich momentan zu der Lösung, die ich in meinem zweiten Post genannt habe (die Resourcen in der Package-Struktur nach hinten schieben, dass sie hier namenseindeutig sind).
Aber ich (wir) will nicht in einem halben Jahr wieder da stehen und denken "Mist, wenn wir nun XY machen wollen, ist diese Resourcen-Struktur total Banane". Daher meine Frage in diese Profirunde :)

Wie es in der Realität so ist, kann ich nunmal nicht für mich entscheiden, wie's gemacht wird. Aktuell sammle ich Lösungen samt Pros und Contras. Das letzte Wort hat eh der Projektverantwortliche :)
 

FArt

Top Contributor
Nun gibt es u.A. das Vorhaben diese Tools auch in eine Gesamtanwendung zu integrieren ...ja, hier sieht es schon nach Plugins aus... aber dennoch die Möglichkeit zu behalten, dass sie selbstständig lauffähig und auslieferbar sind.

Ich würde behaupten, das ist nicht unbedingt so einfach möglich. Die Ressourcen sind m.E. nur der Anfang. Wie sieht es mit Libraries aus (Logging API, ...)? Verwenden alle Applikationen immer die gleiche Version und bleibt das so? Eine Applikation, die nicht für so einen Einsatz konzipiert ist, verwendet gerne auch mal statische Bereiche, die sie plötzlich mit anderen Applikationen teilen muss, das ganze evtl. unsynchronisiert....

Die beste Lösung wäre, jede Applikation sorgt für eine Eindeutigkeit der Ressourcen. Wenn das wirklich das einzige Problem ist dann steht einer Integration nichts mehr im Wege, sonst kann es problematischer werden...
 

KrokoDiehl

Top Contributor
Also danke euch für die Anmerkungen. Ich habe nun genug um damit intern mal ne Diskussion anzustoßen ;)
Wenn ich's nicht vergesse, schreibe ich das Ergebnis. Ansonsten ist das Thema nun zu.
*Tür zumach*
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Best Practice Wie viele Referenzen machen Sinn? Weniger ist mehr? Allgemeine Java-Themen 1
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
Tacofan Hangman so viele Labels wie Buchstaben Allgemeine Java-Themen 5
K Variablen Konstruktor, unendlich viele Allgemeine Java-Themen 3
E Beliebig viele Worte Allgemeine Java-Themen 5
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
R Arrayausgabe enthält viele Leerzeichen Allgemeine Java-Themen 4
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
C Threads Verbraucht eine Zeitabfrage viele Rechen-Ressourcen? Allgemeine Java-Themen 8
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
D (Viele) Daten performant speichern und lesen Allgemeine Java-Themen 5
S Viele zip-files zu einem kombinieren..? Allgemeine Java-Themen 3
S Zu viele Felder. Allgemeine Java-Themen 4
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
O viele Datensätze aus Datenbank - Java Heap Space - Excepion Allgemeine Java-Themen 25
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
T viele Threads Allgemeine Java-Themen 14
T Designfrage: Viele, kleine Objekte Allgemeine Java-Themen 13
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
E Viele if Abfragen auf viele Strings --> Alternative zu if Allgemeine Java-Themen 8
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
K Zu viele Threads -> langsamer angehen. Allgemeine Java-Themen 3
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
RalleYTN Java 9 Module mit Dependency auf Pre-Java 9 JARS Allgemeine Java-Themen 2
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
windl Problem mit externen Nachladen von Jars Allgemeine Java-Themen 10
B Datei innerhalb des JARs von einer statischen Methode aufrufen Allgemeine Java-Themen 4
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
J Jars in unterschiedlichen Versionen Allgemeine Java-Themen 14
X Neuerdings ein Problem mit dem Starten von Jars Allgemeine Java-Themen 5
A Jars oder JNLPs aus java code in gleicher JVM starten Allgemeine Java-Themen 2
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
M Klassen in vielen Jars ermitteln Allgemeine Java-Themen 2
C Runnable Jars Allgemeine Java-Themen 2
M JARS in JAR? Allgemeine Java-Themen 4
D Packages in ausführbaren Jars Allgemeine Java-Themen 4
G Output eines über Runtime.getRuntime.exec gestarteten Jars Allgemeine Java-Themen 6
R Kann ich die jars eines Applets auf verschiedenen Domains hosten? Allgemeine Java-Themen 2
Y JARs austauschen zur Laufzeit Allgemeine Java-Themen 11
D Ahängige Bibliotheken (JARs) ermitteln Allgemeine Java-Themen 6
C Tool zum verkleinern der Jars? Allgemeine Java-Themen 23
V Anderes tmp-dir bei jars? Allgemeine Java-Themen 2
G Applet mit meheren JARs Allgemeine Java-Themen 2
E JFreeChart jars mit in meine Jar packen Allgemeine Java-Themen 6
DeeDee0815 Resourcen in JARs auslagern Allgemeine Java-Themen 4
M Klassen eines Jars auslesen Allgemeine Java-Themen 3
T Wo kann ich einzelne JARs herunterladen Allgemeine Java-Themen 3
H externe JARs in eigenem Programm-Jar einbinden. Allgemeine Java-Themen 5
N Main-Klasse wird beim Aufruf des JARs nicht gefunden Allgemeine Java-Themen 8
M Probleme mit JARs Allgemeine Java-Themen 7
spacegaier HeapSpace der VM ändern -> Verhalten von JARs und EXEs Allgemeine Java-Themen 10
J jars Allgemeine Java-Themen 4
A signed jars gegen keystore "authentifizieren" Allgemeine Java-Themen 7
C Dynamisches Nachladen von JARs (Plugin) Allgemeine Java-Themen 3
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
O Externe Jars in eigene JAr packen in Eclipse Allgemeine Java-Themen 5
A Verzeichnis auflisten - auch innerhalb eines Jars Allgemeine Java-Themen 6
H Jars gehen nicht Allgemeine Java-Themen 6
J Mal wieder jars Allgemeine Java-Themen 2
G Suche Programm um mehrere Jars in eines zu integrieren Allgemeine Java-Themen 7
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
I Benutzer und deren Rechte auslesen Allgemeine Java-Themen 4
hdi Häufige Fehler und deren Lösung Allgemeine Java-Themen 4
M Zugriffsmöglichkeiten von Klassenattributen auf deren Klasse Allgemeine Java-Themen 3
eisioriginal Java Beans und deren Elternklasse Allgemeine Java-Themen 7
M Sonderzeichen bzw. deren Erkennung Allgemeine Java-Themen 3
Saxony DOS Konsole und deren Streams Allgemeine Java-Themen 5
V Objekt einer Klasse, deren Name nur als String vorhanden Allgemeine Java-Themen 4
K Frage zur Deklaration von Variablen und deren Ressourcen Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben