2016-07-18 33 views
0

Ich bin ziemlich neu in Eclipse 4, RCP und SWT und ich bin fest auf dieses Problem: Ich möchte Bildressourcen aus Code mit einem relativen Dateipfad zugreifen. Problem ist, dass der Standard-Speicherort ./ auf mein Home-Verzeichnis /home/name/ eingestellt ist (ich benutze Ubuntu). Ich habe das gefunden, indem ich eine neue Datei erstelle und den CanonicalPath drucke.Relative Dateipfad zum Zugriff auf Ressourcen

Ich bin es gewohnt, dass der Standardspeicherort auf das Projektverzeichnis eingestellt ist, wie /home/name/workspace/project/, was aus dem, was ich bisher gesehen habe, das Standardverhalten in Eclipse/Java-Programmen ist.

Ich möchte dieses Verhalten beibehalten, weil es mir zuverlässiger scheint (nach der Bereitstellung zum Beispiel).

Hinweis: Ich habe e4, rcp und swt markiert, weil ich nicht sicher bin, welche den Unterschied verursacht.

+0

Ist dies ein Plugin, RCP oder eine SWT-App? –

+0

Sie können versuchen, Classname.class.getClassLoader() zu verwenden. GetResource (name); ? – Shettyh

+0

Wie gesagt, bin ich mir ihrer Beziehungen und Unterschiede nicht 100% sicher. (Leider muss ich sie trotzdem benutzen). Ich kann sagen, dass ich "@ Inject" - und "@ PostConstruct" -Anmerkungen verwende, von denen ich denke, dass sie von RCP stammen. Und ich benutze auch SWT, um Windows usw. zu erstellen. Lange Rede, kurzer Sinn, würde ich RCP sagen. Ich hoffe, ich habe Recht. (Ich werde das tatsächlich zu meiner Frage hinzufügen) –

Antwort

0

In einem Eclipse-Plugin (einschließlich RCP-Code) sollten Sie die Klasse FileLocator verwenden, um Ressourcen innerhalb des Plugins zu finden.

Sie öffnen eine Ressource als Stream:

URL url = FileLocator.find(bundle, path, null); 

URL fileUrl = FileLocator.toFileURL(url); 

Vergessen Sie nicht, Ihre Ressourcen-Verzeichnis in der build.properties gehören:

Bundle bundle = ... plugin bundle 

IPath path = new Path("path relative to plugin root"); 

InputStream is = FileLocator.openStream(bundle, path, true); 

Sie auch FileLocator.find verwenden können.

Wenn Ihr Bild nicht im Plugin ist, können Sie relative Pfade nicht wirklich verwenden.

In einer e4-Plugin Sie die Bundle mit @OSGiBundle injizieren:

@Inject 
@OSGiBundle 
Bundle bundle; 

(@OSGiBundle auf der org.eclipse.e4.core.di.extensions Plugin eine Abhängigkeit erfordert).

+0

Ich bin mir nicht sicher, wie ich das 'Bündel'-Objekt bekommen soll. Ich habe es per Injektion versucht, aber es funktioniert nicht. –

+0

Gebündelter Injektionscode hinzugefügt –

+0

Brauche ich etwas mehr? Weil die Annotation "@ OSGiBundle" nicht aufgelöst werden kann. Es gibt jedoch kein Problem mit 'org.osgi.framework.Bundle'. –