# Tomcat - Deploy von Webanwendung



## dflasjjs (25. Feb 2010)

Hi,

ich habe meine Webanwendung in ein WAR-File gepackt. Darin befindet es sich unter WEB-INF/classes/cfg.cfg ein Konfigurationsfile, welches man durch die Anwendung editieren kann.

Beispiel: Anwendung läuft, ich stelle in der Anwendung die Sprache ein, dieses wird im Konfigurationsfile gespeichert.

Beim Deploy wird das WAR-File ja entpackt und es entsteht ein gleichnamiger Ordner.
Wenn die Anwendung nun läuft ich ich ändere die Sprache und dieses wird im cfg-File aktualisiert, dann ja nur im deploy-Ordner und nicht in dem WAR-File.

Wenn ich den Server nun neustarte, wird mein Konfigurationsfile (im Ordner)  mit dem aus dem WAR-File überschrieben?

Ich hab eben Angst, dass alle Einstellungen die ich gemacht habe, durch irgendwelche Umstände verloren gehen und das "originale" Konfigurationsfile aus der WAR-Datei wieder im Deploy-Ordner landet...

Hab ich irgendwie die Möglichkeit das WAR-File zu löschen, damit sowas nicht passiert?
Wenn ich momentan das WAR-File lösche, dann wird der Deploy-Ordner auch entfernt.


----------



## maki (25. Feb 2010)

> Darin befindet es sich unter WEB-INF/classes/cfg.cfg ein Konfigurationsfile, welches man durch die Anwendung editieren kann.


Das ist eine gaaanz schlechte Idee, warum siehst du selber 

Du darfst nicht dahin schreiben, suche eine andere Lösung.


----------



## dflasjjs (25. Feb 2010)

Würde doch reichen, wenn man die Datei außerhalb des WAR-File speicher, oder?

EDIT: Kannst du mir sagen wann genau er das CFG-FIle überschreiben würde? Ich habe gerade mal einen Neustart getestet, aber dann wird nichts überschrieben...


----------



## maki (25. Feb 2010)

Ja


----------



## dflasjjs (25. Feb 2010)

Okay. Wo speicher ich sowas denn standardmäßig hin? Auch in den webapps-Ordner? Ich möchte nicht, dass man die Datei über die direkte Angabe in der Adresszeile aus aufrufen kann, wäre das überhaupt im Webapps-Ordner möglich?

EDIT: Problem was ich eben sehe, wie mache ich der Anwendung klar wo genau das File liegt? Es muss ja irgendwie relativ zum Deploy-Ordner liegen (ich will keinen absoluten Pfad bestimmen, kann ich auch gar nicht, wenn es unter Linux und Windows lauffähig sein soll, oder?)


----------



## citizen_erased (25. Feb 2010)

gegen absolute pfad spricht eigentlich nichts, oder?
ein new File("/bla/blub/dings"); geht unter Windows (das wird dann zu c:\bla\blub\) und Linux (hier noch um schreibrechte für den user kümmern)


----------



## dflasjjs (25. Feb 2010)

Hmm, was ist wenns unter Windows keine C-Partition gibt?

Angenommen ich speichere es im webapps-Ordner, wie komme ich an den Pfad ran (ohne Stringoperationen)?
servletContext().getRealPath("") ist ist ja schon ein Ordner zu weit...


----------



## maki (25. Feb 2010)

Warum nicht ein ContextParam oder ähnliches (Servlet Init Param) in die web.xml setzen mit einem Pfad den es garantiert gibt?

Nebenbei, wenn ich dir schon diese Lösung vorschlage, muss ich dir auch gestehen dass es nicht ganz "sauber" ist [c]java.io.File[/c] in einem ServletContainer (oder jedem anderen JEE Server) zu nutzen, wenn du nicht planst auf einen "richtigen" AppServer umzuziehen sollte es aber keine Probleme bereiten.


----------



## dflasjjs (25. Feb 2010)

Oh ja, super. Funktioniert "wieder" alles.  Vielen Dank maki!

Trotzdem möchte ich gerne verstehen wieso er bei mit die Datei überschrieben hat (nach einem Neustart).
Ich hatte es 1000x getestet und jetzt auf einmal hat er alles überschrieben. Woran kann das liegen?


----------



## maki (25. Feb 2010)

> Trotzdem möchte ich gerne verstehen wieso er bei mit die Datei überschrieben hat (nach einem Neustart).
> Ich hatte es 1000x getestet und jetzt auf einmal hat er alles überschrieben. Woran kann das liegen?


Die Servlet Spec. macht keine Annahmen darüber ob oder wohin  das WAR entpackt wird oder nicht, deswegen ist es keine gute Idee zu versuchen dahin zu scheiben.

Wenn du es genau wissen willst kannst du dir ja mal die Spec. durchlesen (auf die richtige Version achten!), hier das JavaDoc zu ServletContext.getRealPath(String):


> getRealPath
> 
> public java.lang.String getRealPath(java.lang.String path)
> 
> ...


----------

