# Verwenden interner Jars/Resourcen



## dzim (9. Jun 2010)

Hi,

ich hab vor kurzem in eine RCP-App eingebaut, dass icons aus jars mit bestimmten Meta-Informationen geladen werden können. (Hintergrund ist, das ich nicht ca. 4000 Icons vom SVN verwaltet haben möchte...) Ich habe es bisher nur lokal verwendet und aus meinem Eclipse heraus -- da klappt es auch wunderbar. Leider musste ich nach einem Export feststellen, dass es dann nicht mehr klappt.
Hier mal eine kurze Skizze des Aufbaus:
- Core-Plugin mit einer Factory zum Laden der Icons
- resource-Ordner mit jars  im Plugin (jede jar enthält im META-INF eine resource.properties, in der steht, was genau für resourcen drin sind)

Ich habe jetzt mit dem FileLocator diese jars geholt - und jetzt beginnt mein Fehler - und mit resolve die platformspezifischen URLs geholt und daraus File-Objekte generiert. Warum? Ich lade diese File in einen URLClassLoader und habe dann sehr einfach Zugriff auf den Inhalt.

Leider fällt mir da gerade kein anderer Weg ein? Gibt es einen? Und wenn ja, welchen?

Danke vorab schon mal!
Daniel


----------



## maki (9. Jun 2010)

Dir ist klar dass es in Jars (und damit deinem Export) keine Files mehr gibt, sondern nur Entries?
Wenn du deine Icons als Streams laden würdest, wäre es egal ob Jar oder cniht.


----------



## dzim (9. Jun 2010)

Ja... das ist mir klar (geworden)... Aber noch weiß ich nicht, wie ich an die Icons herankommen soll...
Das Problem ist ja einfach:

Core-Plugin.jar!/resource/<weitere-jars>

und ich weiß jetzt nicht, wie ich aus der jar eine jar lade und dann per Stream an die Icons in der internen jar kommen...
Ok - ich hoffe du verstehst noch, was ich meine!


----------



## dzim (9. Jun 2010)

würden die Icons nur im Core-Plugin liegen, wäre es ja kein Problem... Das ist einfach!


----------



## Gelöschtes Mitglied 5909 (9. Jun 2010)

wenn ich dich richtig verstanden habe würde ich in den icon-jars einen extension point erweitern,
und mir einen "IconService" basteln der den extension point zur verfügung stellt.


----------



## dzim (10. Jun 2010)

Ich würde es vielleicht etwas abändern:
Ich denke, man kann es auch so machen, dass mein Core-Plugin einen Extension Point anbietet, der als Elemente jeweils eine Ressourcen-Jar verwendet. Ich würde dann allerdings vom Core-Plugin diesen Extension Point auslesen lassen und nicht extra noch einen Service basteln (hab ich noch nicht gemacht mit OSGi selbst und die Zeit reicht dafür auch nicht mehr...).
Das geht auch schon so weit, das ich die EP-Daten bekomme -- aber wie kann ich mir da jetzt die JarFile-Objekte oder was auch immer raus lesen?


----------



## Wildcard (10. Jun 2010)

Wenn du ImageDescriptors brauchst dann verwende einfach die Statische Methode imageDescriptorFromPlugin in AbstractUIPlugin. Du übergibst die Bundle ID und den relativen Pfad und bekommst einen ImageDescriptor. Wenn du andere Resourcen laden willst dann geht das über den FileLocator.


----------



## dzim (10. Jun 2010)

Das Problem ist, dass ich eben nicht die Unmengen an Icons in irgendeinem Plugin liegen haben will - ich nutze wirklich recht viele... Ich hab, wie gesagt, 4000 zur Auswahl (ok - das erschlägt das Ganze etwas, aber lieber ein paar zu viel, als zu wenig).
Ich möchte sie gern weiterhin als Jars verkapselt lassen (bestimmte Icons sind durch diese Jars quasi gruppiert), aber weiterhin auslesen können.
Wenn mein Plugin, in dem sie liegen, nun aber selbst ein Jar ist, wird das schwer. Ich kann sie dann zwar per FileLocator.find() finden, aber nicht laden. JarFile und ZipFile verlagen eben Files und keine Streams. AbstractUIPlugin und ImageDescriptor wollen direkt ein Image laden - oder letzteres eine URL - und jars in jars werden von java nicht unterstützt.


----------



## dzim (10. Jun 2010)

Ich hab es jetzt über einen Extension Point, ein Factory-Interface und eine dazugehörende Implementierung und doch wieder dem Einsatz von URLClassLoadern hinbekommen...
Ist es schön? Keine Ahnung! Funktioniert es? Ja!
Mit dem URLClassLoader konnte ich dann auch wieder mit imageDescriptor.createFromURL().createImage() arbeiten, da ich ja mit URLs aus dem URLClassLoader arbeiten konnte.
Wer Interesse an seltsamen Lösungen für noch seltsamere Problem hat, dem kann ich es ja mal zukommen lassen oder hier posten.


----------



## Gelöschtes Mitglied 5909 (10. Jun 2010)

wenn du deine factory als osgi services nutzt und den urlclassloader nur intern benutzt würde ich sagen es ist gut


----------



## dzim (11. Jun 2010)

*grummel* euch kann man aber auch nichts recht machen 
Ich fürchte GANZ so sauber ist es nicht... Kein OSGi-Service...

Gibt es da ein gutes Tutorial für, das mich sich mal einen Abend zu Gemüte führen kann, ohne gleich Kopfschmerzen zu bekommen? ;-)


----------

