Input/Output relative Pfadangaben

Tippster

Mitglied
Hallo zusammen,
Ich arbeite in Eclipse mit einem Maven-Project und scheitere an der einfachen Aufgabe ein Bild zu implementieren und zwar weil ich es "nicht finde".
Zuallererst: solange ich absolute Pfade verwende funktioniert alles problemlos (das Bild und die Bildeinbindung selber sind also in Ordnung); mit relativen Pfaden kann ich machen was ich will; da nimmt er es nicht. Wo liegt mein Denkfehler?

Wie gesagt es ist ein Maven Projekt in Eclipse mit folgender Verzeichnisstruktur:
Workspace\MavenArtifactId\src\main\java\MavenGroupId\MavenArtifactId\boundary\Klasse.java
das Bild dazu habe ich im Verzeichnis
Workspace\MavenArtifactId\src\main\java\MavenGroupId\MavenArtifactId\ressources\bild.png

Es steht natürlich auch im target-Verzeichnis zur Verfügung:
Workspace\MavenArtifactId\target\main\classes\MavenGroupId\MavenArtifactId\boundary\Klasse.class
und das Bild:
Workspace\MavenArtifactId\target\main\classes\MavenGroupId\MavenArtifactId\ressources\bild.png

Logisch wäre für mich einer der beiden Ansätze:
1. raus aus dem boundary Verzeichnis mit der Klasse die das Bild aufruft, rein ins ressource Verzeichnis
Code:
Image imgLogo = new Image("file:.\\ressources\\bild.png");
ImageView ivLogo = new ImageView();
ivLogo.setImage(imgLogo);

oder 2. ausgehend von der main Methode, die sich in diesem Verzeichnis befindet:
Workspace\MavenArtifactId\target\main\classes\MavenGroupId\MavenArtifactId\control\Main.class
raus aus dem control Verzeichnis und rein ins ressource Verzeichns (das ist dann der selbe Code)

Wo habe ich mich verlaufen?
 

Oneixee5

Top Contributor
Ich würde versuchen:
ImageIO.read(getClass().getResource("ressources/bild.png"));
oder
ImageIO.read(getClass().getResource("/ressources/bild.png"));

kann auch; ImageIO.read(getClass().getResource("MavenGroupId/MavenArtifactId/ressources/bild.png"));
Es sieht aus als wären MavenGroupId/MavenArtifactId Packages die aus versehen groß geschrieben sind.
 
Zuletzt bearbeitet:

Tippster

Mitglied
Vielen Dank euch beiden für die schnellen Antworten. Was mit Beim ausprobieren aufgefallen ist:
@Oneixee5
Mit ImageIO habe ich überhaupt keine Erfahrung, da ich mit JavaFX arbeite und ImageIo anscheinend ein BufferedImage aus dem awt Bereich ausgibt.
MavenGroupId ist so wie alle anderen Bezeichner in der Pfadangabe ein Platzhalter. die echten Packagenamen sind klein geschrieben.
@thecain
Der Ordner src/main/resources war bei mri nicht angelegt. Habe das nun manuell nachgeholt, und entsprechend adptiert. Eine Anzeige erfolgt aber auch aus diesem Ordner nicht.
 

Oneixee5

Top Contributor
Du kannst ja trotzdem: getClass().getResourceAsStream("MavenGroupId/MavenArtifactId/ressources/bild.png") verwenden. Es gibt ja den Ctor: Image(InputStream).
 

Tippster

Mitglied
@Oneixee5 : Vielen Dank für den Tipp mit dem Konstruktor, das Bild wird nun über den Stream geladen und es funktioniert zumindest schon mal wenn es im selben Verzeichnis liegt. Das war vorher auch noch nicht der Fall.
@thecain : Vielen Dank für den gut geschriebenen und umfangreichen Artikel zu classpath. War nicht einfach hier den richtigen Lösungsansatz zu finden, aber ich habe folgendes draus mitgenommen:
es braucht unter src/main ein resources Verzeichnis. Und in diesem muss die selbe Unterordnerstruktur nachgebaut werden wie in src/main/java. Also z.B.: (Klasse.java ruft dabei das bild auf)
Workspace\MavenArtifactId\src\main\java\MavenGroupId\MavenArtifactId\boundary\Klasse.java
dann soll das Bild unter
Workspace\MavenArtifactId\src\main\resources\MavenGroupId\MavenArtifactId\boundary\bild.png
sein. Dann braucht es keine relativen Pfadangaben mehr und es kann mit
Java:
Image imgLogo = new Image(getClass().getResourceAsStream("bild.png"));
ImageView ivLogo = new ImageView();
ivLogo.setImage(imgLogo);
angezeigt werden. Bin mir jetzt nicht sicher ob das die Profi Lösung ist, aber es funktioniert!
 

Ähnliche Java Themen

Neue Themen


Oben