# tomcat autodeploy



## ruutaiokwu (1. Jul 2010)

hallo zusammen,

habe heute gerade versucht, in eclipse eine webapp als "normales" java-projekt zu erstellen, wo man danach alles manuell einrichten muss. (app server etc.)

nun klappt es mit dem autodeployment aber nicht... mein projekt hat eine (abgespeckte) tomcat version mit dem namen tomcat als unterordner... dortdrin befuindet sich wiederum ein verz. mit dem namen "webapps". 

ich packe keine war's, sondern lasse eclipse direkt ins verz. tomcat/webapps/[deployment]/WEB-INF/classes kompilieren.

da klappt es nicht mit dem hotdeployment.... wenn ich aber ein jar einfüge, während der dienst läuft, stellt das kein problem dar...

UND: wenn ich ein "java web project" in eclipse erstellt, kreiert das im hintergrund auch keine war's, sondern schreibt die komplette struktur in das webapps-verzeichnis...

wesiss jmd., von euch wie das geht?

danke & gruss, jan


----------



## ruutaiokwu (1. Jul 2010)

nachtrag: problem auch bei war's, diese werden nur eingelesen wenn das file nicht schon berreits exisiert...


----------



## ruutaiokwu (9. Jul 2010)

das problem hat sich gelöst...


----------



## nocturne (9. Jul 2010)

Halt! WAR's nie im Entwicklungsprozess verwenden. 


Die Tomcat-Integration in Eclipse ist ganzganzböse! Selfmade ist angesagt!

in der META-INF/context.xml muss folgendes rein:
<Context unpackWARs="true" autoDeploy="true"
       xmlValidation="false"  xmlNamespaceAware="false" reloadable="true">

    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>META-INF/context.xml</WatchedResource>
    <WatchedResource>WEB-INF/classes</WatchedResource>
</Context>

Dabei sind wichtig: reloadable und die WatchedResources  (letzte WR wird rekursiv gescannt.)

Mit dem FileSync-Plugin unter Eclipse wird das entwickeln zum reinen spaß (WebContent-Ordner auf Webapps/[projektname]/ syncen). 
Dann tomcat mit jpda-parameter starten und mit Eclipse auf den Tomcat debuggen. JPDA dem jsp-resourcescanner bekannt geben und die Applikation wird nur noch neu geladen wenn: Eine Struktur einer Java-Methode per jpda geändert wird. 
JSP-Änderungen erfordern nur noch ein Browser-"F5".

Wenn ihr in einer Firma arbeitet: Holt euch einen JSP-Productivity-Coach. Der leitet euch an im RapidDevelopment und Tomcat-Tuning.

LG Noc

Braucht ihr ein avi?


----------



## ruutaiokwu (9. Jul 2010)

hallo nocturne,

danke für deine tipps!

hier wäre die anleitung für mein verfahren, inkl. tomcat abspecken:
(noch nicht ganz fertig und evtl. auch nicht ganz fehlerfrei...)


____________________________________________________________________________________
1.	Tomcat 6 unter Apache Tomcat - Welcome! downloaden und das zip-Archiv in ein Verzeichnis namens „tomcat“ entpacken.

2.	Nun kann der Tomcat abgespeckt werden; es werden nur folgende Dateien / Unterverzeichnisse in den jeweiligen Verzeichnissen benötigt:

Verzeichnis „bin“:
-	bootstrap.jar
-	catalina.bat
-	setclasspath.bat
-	startup.bat
-	tomcat-juli.jar


Verzeichnis „conf“:
-	context.xml
-	tomcat-users.xml
-	web.xml
-	Die Datei „server.xml“ muss in das Tomcat-Wurzelverzeichnis verschoben werden.


Verzeichnis „conf/Catalina/localhost“:
-	manager.xml


Verzeichnis „lib“:
-	annotations-api.jar
-	catalina.jar
-	el-api.jar
-	jasper-el.jar
-	jasper-jdt.jar
-	jsp-api.jar
-	servlet-api.jar
-	tomcat-coyote.jar
-	jasper.jar


Verzeichnis „logs“:
-	Das Verzeichnis logs in von Grund auf leer…


Verzeichnis „temp“:
-	safeToDelete.tmp


Verzeichnis „webapps“:
-	manager	(Verzeichnis!)
-	ROOT		(Verzeichnis!)


Verzeichnis „work“:
-	Das Verzeichnis work ist von Grund auf leer…


3.	Nun müssen verschiedene Anpassungen in diversen Dateien vorgenommen werden:

Datei „conf/web.xml“:

-	Öffnen Sie diese Datei mit einem Texteditor und suchen Sie nach dem Begriff „invoker“. Dann werden Sie einen Abschnitt in dieser Art finden:

****************************************************************************************
<!-- 
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
            	<param-name>debug</param-name>
            	<param-value>0</param-value>
        	</init-param>
        	<load-on-startup>2</load-on-startup>
</servlet>
	-->
****************************************************************************************

Entfernen Sie nun die oberste und die unterste Zeile. Andernfalls die die Anweisung bloss ein Kommentar.


Datei „context.xml“:

-	Öffnen Sie diese Datei mit einem Texteditor und suchen Sie nach dem Tag <Context>. Fügen Sie diesem das Attribut privileged=“true“ hinzu, so dass es folgendermassen aussieht:

<Context privileged=“true“>


4.	Zusätzlich muss eine Datei hinzugefügt werden:

- Erstellen Sie im Verzeichis conf/Catalina/localhost eine Datei mit dem Namen webapp.xml, wobei diesem einem beliebigen Namen annehmen kann. Der Namen der Datei, ohne Dateierweiterung, bildet bei der Webapplikation den Namen des Context…

Der Inhalt der Datei hat folgendermassen auszusehen:

****************************************************************************************

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:\Development\workspaces\sls_workspace\SLSFromSVN\build"
	antiResourceLocking="false" reloadable="true">
	<Manager className="org.apache.catalina.session.PersistentManager"
		distributable="false" saveOnRestart="false">
		<Store className="org.apache.catalina.session.FileStore" />
	</Manager>
</Context>

****************************************************************************************

(Der Pfad ist individuell...)

Es ist darauf zu achten, dass das reloadable-Attribut auf true gesetzt ist; andernfalls findet kein Hot-Deployment statt!

____________________________________________________________________________________


wichtiger hinweise: 

-tomcat 6.0.0.20 verwenden, keine höhere version. diese das problem beim redeployment, die resourcen zu bereinigen!

-die tomcat-users-datei lösche ich nicht, weil ich die tomcat manager-app auch nicht lösche. (dort sind die account definiert)

-die PersistentManager-angelegenheit hat zur folge, dass der tomcat nicht mehr auf das filesystem serialisiert. war vermeintlich ein problem, hat sich aber nachträglich herausgestellt dass es doch keins war...


grüsse & ein schönes wochenende,
jan


----------



## nocturne (9. Jul 2010)

Bitte. Ich hab mich zu schroff ausgedrückt, sorry.



jmar83 hat gesagt.:


> -	Die Datei „server.xml“ muss in das Tomcat-Wurzelverzeichnis verschoben werden.


Wow, das ist krass. Das klappt?


----------



## ruutaiokwu (9. Jul 2010)

"muss" ist natürlich nicht grundsätzlich gemeint, das gilt nur für meinen fall...

der tomcat muss dann halt anders gestartet werden:

catalina -config [server.xml pfad] start

werde dein verfahren (tönt durchaus interessant!) montags genauer anschauen, wenn ich wieder am arbeiten bin. hatte die letzten tage eine riesensache mit dem tomcat (besonders wegen dem problem mit der resourcenbereinigung...) und momentan voll den overkill davon...! des weiteren habe ich nicht alles zur hand, weil ich nicht mehr bei der arbeit bin...


gruss, jan


----------



## ruutaiokwu (12. Jul 2010)

hallo,

noch ein paar hinweise:

1. die vom mir beschreibene vorgehensweise unter punkt 4 beschreibt die sog. "virtual deployment"-technik. damit kann auch woanders publiziert werden als unter tomcat/webapps.

das ist optimal, wenn man bei einem eclipse-projekt z.b. einen order "build" hat (die eigentliche webapp, mit dem WEB-INF-verz. und irgendwelchen resourcen...) daneben hat man, auf gleicher verzeichnisebene, einen ordner tomcat. (z.b. in einer nach meinem verfahren abgespeckten version.) in diesem fall hätte jedes eclipse-projekt einen eigenen tomcat. (was meiner meinung sinnvoller ist!!!)

2. so wie es aussieht, kann auf <WatchedResource>dateiname.xyz</WatchedResource> verzichtet werden; vorausgesetzt das InvokerServlet wird in der datei web.xml freigeschaltet. danach MUSS aber das attribut privileged="true" im Context-tag in der datei context.xml (vom tomcat "generell", unter /tomcat/conf) hinzugefügt werden. (sonst gibt's ne exception beim starten...)

(das invoker-servlet muss aber aus sicherheitsgründen bei einem produktiven server UNBEDINGT deaktiviert bleiben!!!)

3. apropos FileSync-plugin (werde ich bei gelegenheit anschauen): das erübrigt sich, wenn man das "Default Output Folder" nach /eclipse_workspace/[Projektname]/build/WEB-INF/classes setzt... dann wird automatisch dorthin kompiliert, was mit den von mir beschreibenen vorbereitungsschritten problemlos zu klappen scheint. wenn ich was im code ändere, ist das kurze zeit später automatisch publiziert.

4. ich erstelle KEIN "Dynamic Web Project", mit diesem doofen WebContent-ordner. sondern ein ganz "normales" java-projekt. wenn ich ein servlet hinzufügen will, erstelle ich einfach eine java-klasse "extends HttpServlet"... anschliessend rechtsklick in den source, einträge "Source" -> "Override/Implement Methods..." und schon kann doGet(...), doPost(...) und co. überschreiben werden.

5. bei jboss, der überigens den servlet-container von tomcat enthält, ist das ganze ziemlich gleich, abgesehen dass sich die files nicht im gleichen pfad befinden. die einstellungen innerhalb der files sind allerdings die gleichen. beim deployen von webapps in nicht-gepackter form ist darauf zu achten, dass das verzeichnis am ende mit .war aufhört. tönt komisch, ist aber so...


grüsse,
jan


----------

