Relative Pfade

Ich habe eine Webapplikation die in einem Tomcat Server läuft. Diese Applikation benutzt an verschiedenen Stellen relative Pfade zu bestimmten Dateien

...new File("einOrdner/eineDatei.txt");

In meiner Test/Entwicklungsumgebung läuft alles supie, aber ich habe diese Webapplikation auf einem anderen Server deployed und da läuft sie nicht mehr…weil:

bei relative Pfade wird nicht wie in der Entwicklungsumgebung

/ichBinAußerhalb/TomcatInstallationsRoot/

angehangen sondern

/ichBinAußerhalb/TomcatInstallationsRoot/temp/

meine erste Idee war:

URL url = FileContext.class.getResource("../../../../../../");
if(url == null)
{
 throw new IOException("Root konnte nicht gefunden werden");
}
String rootPath = url.getPath();

Ich bin von Ordner der Klasse aus in Richtung WEB-INF „gewandert“ und das Ergebnis sollte eigentlich der Pfad zum WEB-INF Ordner sein. Hat aber nicht funktioniert…

Dann bin ich Schrittweise gegangen und das Ergebnis ist etwas merkwürdig…bei 4 x „…/“ war ich im Lib-Ordner des Tomcats?!? bei 6 x „…/“ war ich im plötzlich in einem Unterordner von Tomcats Temp Ordner. Ich verstehe das nicht. Wie soll das gehen, ich sage gehe zwei Schritte in Richtung Root (von 4x auf 6x) und er macht 3 Schritte weg von der Root. Warum liefert nur 4x bzw. 6x „…/“ ein Ergebnis?

Gibt es irgend eine Möglichkeit wie ich das Problem lösen kann? Vielleicht durch anpassen der Tomcat Konfiguration? Kann mir jemand sagen wie ich die Sache mit den getResources() richtigt gemache?

PS:
Die Sache mit dem ServletContext (was ich ständig gelesen habe) geht nicht. Da die betroffenen Klassen keine Servlets sind und keine „Verbindung“ zu Servlets haben. Denn es ist ein „normales“ JavaSE Projekt das in einem großen Tomcat-Projekt „eingebaut“ ist (automatisches Build von SVN). Das Projekt wird auch nicht als JAR eingefügt sondern die Klassen werden compiliert und unter WEB-INF/classes/… gepackt.

Das gleiche passiert auch mit den Logdateien der Applikation, die landen nicht in

/ichBinAußerhalb/TomcatInstallationsRoot/webapps/Application/WEB-INF/ressourcen/log/\*.xml

sondern in

/ichBinAußerhalb/TomcatInstallationsRoot/temp/IrgendeinZufallsOrdnerVomEntpacken/webapps/Application/WEB-INF/ressourcen/log/\*.xml

PS: Relative Pfade
die Sache mit getResources() sollte nur als Notlösung herhalten…besser wäre wenn mir jemand sagen könnte, wo der Fehler in der Konfiguration liegt. Denn auf 2 Entwicklungsserver (Windows) und ein Produktivserver (Linux) ist es so, das immer der Pfad zum Installationsordner vom Tomcat angehangen wird.

Hallo,

/ichBinAußerhalb/TomcatInstallationsRoot/

Dieser Pfad lässt sich i.d.R. als Java Property catalina.base abfragen. Auf eine Datei relativ zu diesem Pfad solltest du also mit

File file = new File(System.getProperty("catalina.base"), "einOrdner/eineDatei.txt");

zugreifen können.

Gruß
Heavy

Danke für die Antwort

Das ist auch die Lösung die ich nachdem „Quick and Dirty“ Verfahren eingebaut habe…da ich nirgends eine sinnvolle Lösung gefunden haben.

Meine Lösung:

Dieses Interface beschreibt ein File-Objekt-Builder der von der Software benutzt wird.

public interface FileBuilder
{
 public File createFile(String relativePath);
}

Passend dazu gibts noch eine Factory, die eine Instanz dieses Interface holt.

public class FileBuilderFactory
{
 public static FileBuilder createFileBuilder()
 {
 return FileBuilderFactory.initFileBuilder();
 }

 private static FileBuilder initFileBuilder()
 {
 //die Initialisierung des richtigen FileBuilder
 return fileBuilder;
 }
}

Die Implementierung des Interface FileBuilder arbeitet genau nach diesem Schema, erst auf „cataline.base“ prüfen, wenn NULL, dann auf „catalina.home“ prüfen, wenn immer noch NULL, wird eine Konfigurationsdatei gelesen…