Classpath ResourceBundle Problem bzgl. Pfade bzw. Pfade (auch in Eclipse) generell?

andreT

Aktives Mitglied
Hallo,

bis heute kämpfe ich immer wieder mit diesem ganzen Pfad Wirr-Warr 😀
Beruflich ist man meist in laufenden Umgebungen unterwegs wo der Zugriff auf Resourcen schon gelöst bzw. umgesetzt ist. Nun habe ich aber aktuell ein kleines privates Projekt was ich mit Eclipse lösen will :shock:

Wie folgt: Ich habe eine kleine Sourcen-Library (lib) die ich beim Erzeugen des Projektes in den src Ordner kopiere.
Ich habe aber noch weitere Resourcen in einem Ordner (resources) die ich in das Hauptverzeichnis des Eclipse Projektes kopiere. Die Verzeichnisstruktur sieht dann so aus :

MeinProjekt
|
--settings
|
--bin
|
--resources
|
--src
| |
| --lib
|
--.classpath
|
--.project

Der Ordner resources enthält u.a. dann auch die Property Dateien die für meine Lokalisierungen notwendig sind. Leider habe ich aber das Problem daß ich nicht mit dem üblichen Weg
ResourceBundle bundle = ResourceBundle.getBundle(resourceBundleBasename,getCurrentLocale());
darauf zugreifen kann da die Files (so wie ich das sehe) nicht in meinem Classpath liegen. Was nun also tun?
Die Files z.B. auch Images sollen in resources liegen und letztendlich nicht in das jar mit einfliessen. Der Ordner resources wird dann im gleichen Verzeichnis liegen wie das jar-File.

Wie kann ich denn nun auf diesen Ordner bzgl. ResourceBundle zugreifen? Hat jemand 'n Tipp?
 
Zuletzt bearbeitet:
Ich würde die Resources auch in ein jar-File packen und nicht als Dateien auf dem Filesystem rumliegen lassen. Dann kannst Du sie mit getClass().getResourceAsStream laden. Um auch während der Entwicklungszeit (da hat man ja noch kein Jar) darauf zugreifen zu können, machst Du Deinen resources-Folder zu einem Sourcefolder in Eclipse. Und zur Ordnerstruktur, es hat sich -beeinflusst von maven- eine bestimmte Ordnerstruktur etabliert, an die Du dich auch halten solltest:
Code:
meinProjekt/
  src/
    main/ <-- Hier liegt alles, was zum laufenden Programm gehören soll.
      java/ <--Source Folder in Eclipse
      resources/ <--Source Folder in Eclipse
    test/ <-- Hier liegt alles, was automatisierten Tests dient, bspw. Unit-Tests
      java/ <--Source Folder in Eclipse
      resources/ <--Source Folder in Eclipse
    lib/ <-- Kann man machen, Build Tools arbeiten aber auch oft mit zentralen Repositories
 
... beeinflusst von maven- eine bestimmte Ordnerstruktur etabliert, an die Du dich auch halten solltest:
Code:
meinProjekt/
  src/
    main/ <-- Hier liegt alles, was zum laufenden Programm gehören soll.
      java/ <--Source Folder in Eclipse
      resources/ <--Source Folder in Eclipse
    test/ <-- Hier liegt alles, was automatisierten Tests dient, bspw. Unit-Tests
      java/ <--Source Folder in Eclipse
      resources/ <--Source Folder in Eclipse
    lib/ <-- Kann man machen, Build Tools arbeiten aber auch oft mit zentralen Repositories

Danke erstmal!
Hmmm ... leider kann ich (zumindest nicht alle) Resourcen in ein (extra) jar packen da die Files/Textfiles mitunter täglich manuell und von anderen non-Java Tools geändert/aktualisiert werden sollen. Mir bleibt also in diesem Fall keine andere Möglichkeit als meine Resourcen in einem parallelen Ordner zum eigentlichen jar zu parken.

Wenn es nun keine Möglichkeit gibt über den üblichen ResourceBundle-Weg bzw. via Filezugriff auf die Dateien zuzugreifen muss ich mir wohl selbst eine Lokalisierung basteln, oder?
 
andreT hat gesagt.:
Wenn es nun keine Möglichkeit gibt über den üblichen ResourceBundle-Weg bzw. via Filezugriff auf die Dateien zuzugreifen muss ich mir wohl selbst eine Lokalisierung basteln, oder?
In das JAR wandern sie auch erst bei der fertig gebauten Applikation. In der Entwicklungsumgebung liegen sie ja noch als Files vor. Dort können sie auch mit non-Java Tools von Euren Übersetzern bearbeitet werden.

Internationalisierte Texte, die bei einem fertig gebauten und installierten Programm nahezu täglich geändert werden, hören sich für mich etwas merkwürdig an. Falls Du so was brauchst, schreib doch vielleicht am besten noch etwas mehr zum Hintergrund dieser Anforderung. Da kann man dann besser Ideen entwickeln.
 
Die Anwendung bau ich in eigener Sache und bin daher frei/offen für alles neues/sinnvolles.

Mir wiederstrebt es irgendwie jegliche Resourcen (selbst während des Entwicklungsprozesses) innerhalb des src-Ordners zu halten. Ist das eine gängige Praxis? Ich hab bestimmt vor 10 Jahren das letzte mal 'nen Compiler geschweige denn ein Buildtool selbst/über die Console angeworfen!
Ich habe schon so einige Projekte mit WSAD/RAS (mit-)gestemmt, aber nie irgendwelche Resourcen in src-Ordnern gesehen. Wobei ich zugeben muss daß ausgelagerte Resourcen immer in weiteren Projekten zu finden waren. Aber ob die da nicht auch in den src-Ordnern lagen weiß ich aber ehrlich gesagt nicht 😀

Wie macht man's denn nun? Ist deine o.a. Struktur aktuelle/up-to-date Praxis? Maven wird bei uns noch nicht eingesetzt, wir sind immer noch mit Ant & Co. unterwegs. Eine Umstellung wird angedacht. Und hier bei mir daheim mach ich das natürlich alles nur aus Eclipse heraus.
Wie auch immer, jetzt sitze ich hier daheim und kämpfe nun damit mir eine sinnvolle Struktur einfallen zu lassen die während der Entwicklung und im anschließenden Produktiven Umfeld nicht mit den Pfaden zu kämpfen hat und einigermaßen übersichtlich ist. Ich hätte z.B. auch gerne daß meine weiteren jars (log4J,netbeans,mysql-connector,...) ebenfalls in diesem resource/lib-Ordner wiederzufinden sind. Lange Rede, kurzer Sinn : Gibt es ein Patentrezept zum Auslagern sämtlicher Resourcen, die in einer produktiven Umgebung zugreifbar/austauschbar und leicht widerzufinden sind und KEINEN neuen Buildprozess bzw. Bauen eines neuen jars benötigen? Wie gesagt, die Files sollten auch von Drittanbietertools zugreifbar sein.

Wie baut man nun so eine Eier legende Wollmilchsau? 😀
 
Zuletzt bearbeitet:
Für die interessierte/suchende Nachwelt :

Ich habe in Eclipse jetzt die Ordnerstruktur :

MeinProjekt
|
--settings
|
--bin
|
--resources
|
--src
|
--.classpath
|
--.project

Die Resourcen (Bilder, *.jar, ResourceBundle-Files, *.properties, ...) habe ich also NICHT im src Verzeichnis!

Der Zugriff auf z.B. das ResourceBundle-File meldungen erfolgt jetzt alternativ mit
Java:
PropertyResourceBundle bundle = new PropertyResourceBundle(new FileInputStream("C:/test/resources/meldungen_de.properties"));
Der Dateipfad kann mit user.dir ermittelt werden und die Locale kann natürlich mit toString() an den Dateinamen angehangen werden. So wird dann auch immer die korrekte Datei gefunden.
Auf diese Weise können also beliebige ResourceBundle-Files als (externe) Datei (und somit nicht mit relativer Pfadangabe geladen) werden. Das funktioniert dann auch problemlos im produktiven Umfeld.

Wenn ich mein *-jar exportiere, kopiere ich den Ordner resources manuell in das gleiche Zielverzeichnis und passe (vorher) die MANIFEST.MF in meinem *.jar-Archiv entsprechend an. So können auch alle notwendigen *.jars aus dem Ordner resources gefunden werden.

Weder innerhalb Eclipse noch in der produktiven Umgebung habe ich noch Probleme mit den Pfaden und die Drittanbietertools haben ebenfalls Zugriff auf die Resourcen.

Thema erledigt!
 
Wenn ich mein *-jar exportiere, kopiere ich den Ordner resources manuell in das gleiche Zielverzeichnis und passe (vorher) die MANIFEST.MF in meinem *.jar-Archiv entsprechend an.

Nee, nicht wirklich, oder :autsch:

Warum nicht über den Classpath, a la getResource(String name). Das funzt in Eclipse, alles in einem JAR, oder als externe Dateien.

Das Du zum Deployen daran denken musst, neben der JAR auch noch die resources zu kopieren UND das Manifest anzupassen, halte ich doch für ein fragwürdiges Vorgehen:shock:
 
Nee, nicht wirklich, oder :autsch:
Doch! :bae:

Warum nicht über den Classpath, a la getResource(String name). Das funzt in Eclipse, alles in einem JAR, oder als externe Dateien.
Seit wann können externe bzw. Drittanbietertools oder sogar das eigene Programm Dateien (u.a. via JAXB Zugriff) innerhalb von jars ändern? Wohl eher nicht, oder? :autsch:

Das Du zum Deployen daran denken musst, neben der JAR auch noch die resources zu kopieren UND das Manifest anzupassen, halte ich doch für ein fragwürdiges Vorgehen:shock:
Kann ja sein das du es so für dich hälst, aber genau so ist es in diesem Fall gewollt! Das sowas manchmal notwendig/sinnvoll sein kann, wirst du sicher auch noch lernen 😀

edit : Im Übrigen ist Eclipse beim Export offensichtlich zu blöde um meine MANIFEST.MF korrekt anzupassen. Daher bleibt mir hier der (einmalige!) manuelle Eingriff leider nicht erspart!
 
Zuletzt bearbeitet:

Zurück
Oben