Resource finden

Hallo

Ich bin am verzweifeln. Ich versuche eine Datei zu finden mittels getResources.


this.getClass().getClassLoader().getResource("/src/main/resources/strings.xml");


Das Programm findet aber nichts an dieser Stelle.

Pfad zu der Datei: NetBeansProjects\javaLernen\src\main\resources\strings.xml
Pfad zu der Klasse: NetBeansProjects\javaLernen\src\main\java\lernen\java\view\Fenster.java

Kann mir bitte jemand zeigen wie es richtig gehen soll. Ich habe schon halb Google durch gelesen und komme trotzdem nicht weiter.

lg
Zicky

Du musst gedanklich klar trennen zwischen Pfaden zu Resourcen im Filesystem und Pfaden zu Resourcen eines Classloaders. Du hast hier beides vermischt. Wenn du über einen Classloader eine Resource laden möchtest, dann musst Du den Package-Pfad angeben. Wenn “strings.xml” also im Default-Package liegt, ist es “/strings.xml”.

Nebenbei kannst Du auch den Aufruf noch verkürzen:

getClass().getResource("/strings.xml");
// Oder doch gleich einen InputStream!
getClass().getResouceAsStream("/strings.xml");

Damit Du Resourcen über einen Classloader laden kannst, müssen diese natürlich auch im Classpath liegen. Deine Verzeichnisstruktur sieht so aus als würdest Du ein Buildtool (evtl. Maven?) verwenden. Deshalb nehme ich an, dass “/src/main/resources/” auch dem Classpath hinzugefügt wurde? (In der IDE als Source-Folder definiert/im fertigen jar mit enthalten/beim Programmaufruf mit angegeben etc.)

Naja…

müsste wohl eher:
this.getClass().getClassLoader().getResource("/main/resources/strings.xml");
reichen würde auch
this.getClass().getResource("/main/resources/strings.xml");
Falls Du die XML per Reader auslesen willst, würde ich diese als Stream auslesen.
this.getClass().getClassLoader().getResourceAsStream("/main/resources/strings.xml");

Ok ich habe jetzt die Datei verschoben

Pfad der XML: src\main\java\lernen\java\res\strings.XML
Pfad der Klasse: src\main\java\lernen\java\view\Fenster.Java

Wenn ich dich richtig verstehe, dann müsste

getClass().getResource("/res/strings.xml");

Das erwünschte Ergebnis liefern oder ?

müsste wohl eher:
this.getClass().getClassLoader().getResource("/main/resources/strings.xml");
reichen würde auch
this.getClass().getResource("/main/resources/strings.xml");
Falls Du die XML per Reader auslesen willst, würde ich diese als Stream auslesen.
this.getClass().getClassLoader().getResourceAsStream("/main/resources/strings.xml");

*** Edit ***

irgendwie ist genau dieser krams der grund warum ich keine IDE nutze sondern lieber mit notepad und terminal arbiete

@TO
das problem ist das eine IDE beim compilen normalerweise für die class-daten eine andere ordner-struktur aufweist
wenn du also sagst das sich dein source-file hier befindet : NetBeansProjects\javaLernen\src\main\java\lernen\java\view\Fenster.java
dann dürfte sich dein class-file in etwa dort zu finden sein lassen : NetBeansProjects\javaLernen\bin\main\java\lernen\java\view\Fenster.class
abweichend statt bin auch gerne mal dist oder wenn ein debug-build gewählt wurde auch unter debug

wenn jetzt deine resource direkt im src liegt ist es bei den meisten IDEs so das sie solche resourcen komplett irgnorieren und weder beim compilen mit umkopieren noch beim export mit ins jar packen

grundsätzlich lässt sich sowas mit einem import lösen … du musst der IDE also sagen : das sind meine resourcen … und die IDE kümmert sich dann mit einem speziellen classloader um die korrekte auflösung der pfade
auch sollte man grundsätzlich drauf achten das sich resourcen weder im src noch in bin befinden sondern in einem extra-ordner rsc auf der gleichen ebene … also in etwa so

NetBeansProjects/javaLernen/src
NetBeansProjects/javaLernen/bin
NetBeansProjects/javaLernen/rsc

so das die resourcen halt unabhängig vom compiling sind
eine gute IDE erkennt das dann auch (wenn korrekt angegeben und ins projekt importiert) und kümmert sich dann wie gesagt zur runtime um die korrekte pfadauflösung als auch um das korrekte packen bei einem export

helfen dürfte schonmal

System.out.println("Value = " + url);

welches Verzeichnis kommt da heraus? bei mir bin-Verzeichnis,
mit …/ über bin hinaus geht gar nicht, in die packages zu den class-Dateien hinein geht

glücklicherweise wird standardmäßig alles aus src kopiert, auch die Ressourcen, aber nix mehr mit ‘src’ im Pfad


[QUOTE=Unregistered]müsste wohl eher:
this.getClass().getClassLoader().getResource("/main/resources/strings.xml");
reichen würde auch
this.getClass().getResource("/main/resources/strings.xml");
[/QUOTE]
na das zweite nicht ganz, dann befände man sich relativ zum package = Unterverzeichnis der Klasse,
dort wird main und resources nicht direkt zu finden sein

mit …/ kommt man aber höher falls nötig

Ok
ich habe den Fehler gefunden, es lag an NetBeans, die richtige Lösung hatte ich bereits ausprobiert gehabt vor paar Stunden.

NetBeans kopiert die Quelldateien in einen speraten Ordner und startet das Programm von da. Die Resourcen wurden aber nicht mit kopiert. Deswegen war mein Pfad auch falsch.

Funktioniert jetzt einwandfrei. Danke an alle

Du nutzt Maven richtig?

Dann hast du folgende Ordnerstruktur auf die es ankommt:


main
  |- java
  |- resource

im Ordner Java liegen deinen Klassen und deine XML im resourcen-Ordner. Das hattest du mal und kannst du auch so lassen. Wenn du nun die strings.xml direkt unter resource hast, dann kannst du so drauf zugreifen: this.getClass().getResource("/strings.xml");. Denn sowohl das was direkt unter java als auch das was unter resource liegt, kannst du als deinen Root-Pfad ansehen.

*** edit ***

Ok zu spät, scheint sich ja erledigt zu haben.

[QUOTE=SlaterB]na das zweite nicht ganz, dann befände man sich relativ zum package = Unterverzeichnis der Klasse,
dort wird main und resources nicht direkt zu finden sein[/QUOTE]
Evtl. verstehe ich die Aussage nicht ganz die Methode getResource aus Class delegiert den Aufruf an den ClassLoader. Bei vorangestelltem “/” wird der Ausdruck als absolut interpretiert.
Nur wenn man den vorangestellten Slash weglässt wird die Pfadangabe als relativ zur Klasse aufgelöst.

das hatte ich übersehen

[QUOTE=Tomate_Salat;100596]Du nutzt Maven richtig?

Dann hast du folgende Ordnerstruktur auf die es ankommt:


main
  |- java
  |- resource

im Ordner Java liegen deinen Klassen und deine XML im resourcen-Ordner. Das hattest du mal und kannst du auch so lassen. Wenn du nun die strings.xml direkt unter resource hast, dann kannst du so drauf zugreifen: this.getClass().getResource("/strings.xml");. Denn sowohl das was direkt unter java als auch das was unter resource liegt, kannst du als deinen Root-Pfad ansehen.

*** edit ***

Ok zu spät, scheint sich ja erledigt zu haben.[/QUOTE]

Danke dir nochmal, genau so ist das. Ich habe übrigens noch herausgefunden, wenn zwischendurch bei Netbeans clean & build ausgeführt wird, dann kopiert er auch die resourcen in den build ordner.