Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Main




JSPWiki v2.2.33

[RSS]


Hide Menu

TomcatAntTasks


Difference between version 21 and version 5:

At line 1 changed 1 line.
[I|MattRaible]'ve been told I should use Tomcat's Ant Tasks (install, list, refresh, remove) in [AppFuse] to ease deployment of the app. So I tried that today (June 24, 2003). Here's how I set it up and what I found. I hope to use this page to get a consensus on how these tasks should be used.
[I|MattRaible] finally figured out how to use Tomcat's Ant Tasks (install, remove, reload, start, stop, list) in [AppFuse] to ease deployment of the app. Below is a list of of the steps I used to integrate them into my build.xml file.
At line 3 changed 1 line.
1. First, I defined a tomcat.classpath for the catalina-ant.jar file. Putting in in $ANT_HOME/lib did not work - and this way seemed cleaner. So in __properties.xml__, I added:
1. Rather than defining each task with a <taskdef>, I created a tomcatTasks.properties file with the following contents:
At line 5 changed 5 lines.
<!-- For Tomcat Tasks -->
<path id="tomcat.classpath">
<fileset dir="${tomcat.home}/server/lib"
includes="catalina-ant.jar" />
</path>
deploy=org.apache.catalina.ant.DeployTask
install=org.apache.catalina.ant.InstallTask
list=org.apache.catalina.ant.ListTask
reload=org.apache.catalina.ant.ReloadTask
remove=org.apache.catalina.ant.RemoveTask
resources=org.apache.catalina.ant.ResourcesTask
roles=org.apache.catalina.ant.RolesTask
start=org.apache.catalina.ant.StartTask
stop=org.apache.catalina.ant.StopTask
undeploy=org.apache.catalina.ant.UndeployTask
At line 11 changed 1 line.
2. Then in __build.xml__, I define the tasks in the "define-tasks" target:
2. Then I created a tomcat.properties file with the following contents. Make sure the $CATALINA_HOME/conf/tomcat-users.xml file has an entry with username/password __admin/admin__ and that they have the __manager__ role.
At line 13 changed 13 lines.
<!-- Tomcat Tasks -->
<taskdef name="install"
classname="org.apache.catalina.ant.InstallTask"
classpathref="tomcat.classpath" />
<taskdef name="list"
classname="org.apache.catalina.ant.ListTask"
classpathref="tomcat.classpath" />
<taskdef name="reload"
classname="org.apache.catalina.ant.ReloadTask"
classpathref="tomcat.classpath" />
<taskdef name="remove"
classname="org.apache.catalina.ant.RemoveTask"
classpathref="tomcat.classpath" />
# Properties for Tomcat Server
tomcat.server=localhost
tomcat.manager.url=http://${tomcat.server}:8080/manager
tomcat.username=admin
tomcat.password=admin
At line 27 changed 1 line.
3. Then I created targets for each one of these tasks:
3. I included a reference to tomcat.properties in my build.xml file:
At line 29 changed 8 lines.
<!-- =================================================================== -->
<!-- install, list, reload and remove are all Tomcat deployment targets. -->
<!-- =================================================================== -->
<target name="install" depends="package-web"
description="Install application to servlet container">
<install url="${tomcat.manager.url}" username="${tomcat.username}"
password="${tomcat.password}" path="/${webapp.name}"
war="file://${webapp.dist}/${webapp.war}"/>
<property file="tomcat.properties"/>
}}}
4. Then I added all a single taskdef and all the targets/tasks I wanted to use to my build.xml file:
{{{
<taskdef file="${ant-contrib.dir}/tomcatTasks.properties">
<classpath>
<pathelement path="${tomcat.home}/server/lib/catalina-ant.jar"/>
</classpath>
</taskdef>
<target name="install" description="Install application in Tomcat"
depends="package-web">
<deploy url="${tomcat.manager.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="/${webapp.name}"
war="file:${webapp.dist}/${webapp.war}"/>
At line 39 changed 4 lines.
<target name="list" depends="define-tasks"
description="List installed applications on servlet container">
<list url="${tomcat.manager.url}" username="${tomcat.username}"
password="${tomcat.password}" />
<target name="remove" description="Remove application in Tomcat">
<undeploy url="${tomcat.manager.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="/${webapp.name}"/>
At line 45 changed 4 lines.
<target name="refresh" depends="package-web"
description="Reload application on servlet container">
<reload url="${tomcat.manager.url}" username="${tomcat.username}"
password="${tomcat.password}" path="/${webapp.name}"/>
<target name="reload" description="Reload application in Tomcat">
<reload url="${tomcat.manager.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="/${webapp.name}"/>
At line 51 changed 4 lines.
<target name="remove" depends="define-tasks"
description="Remove application on servlet container">
<remove url="${tomcat.manager.url}" username="${tomcat.username}"
password="${tomcat.password}" path="/${webapp.name}"/>
<target name="start" description="Start Tomcat application">
<start url="${tomcat.manager.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="/${webapp.name}"/>
At line 56 removed 2 lines.
}}}
__NOTE:__ I used "refresh" as a target name since I already have a "reload" task that stops tomcat, undeploys, cleans and redeploys.
At line 59 changed 1 line.
4. My understanding is that I should be able to point the ''install'' and ''refresh'' tasks at the .war file for my app, and it'll install/reload as requested. The ''list'' and ''remove'' tasks work fine at this point.
<target name="stop" description="Stop Tomcat application">
<stop url="${tomcat.manager.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="/${webapp.name}"/>
</target>
At line 61 changed 5 lines.
----
!!My Issues:
__Install: Doesn't work.__ I get the good ol' {{java.sql.SQLException: Cannot load JDBC driver class 'null'}}. Everything looks fine from the Ant side though:
{{{
[install] OK - Installed application at context path /appfuse
<target name="list" description="List Tomcat applications">
<list url="${tomcat.manager.url}"
username="${tomcat.username}"
password="${tomcat.password}"/>
</target>
At line 67 removed 20 lines.
If I restart Tomcat, everything starts and loads just fine.
__Remove: Doesn't seem to work__, but it actually does. Here's what Ant reports:
{{{
[remove] FAIL - Encountered exception java.io.IOException: java.lang.NullPointerException
}}}
If I run the same task again, I get:
{{{
[remove] FAIL - No context exists for path /appfuse
}}}
Proving that it actually did work the first time.
__Reload: Doesn't work__:
{{{
[reload] FAIL - Reload not supported on WAR deployed at path /cct
}}}
Even though my context has ''reloadable="true"''
----
!!My Thoughts
* The problem might be that I'm not pointing to a build/appfuse directory that contains an already intact webapp directory structure - instead I'm pointing to a ''real'' .war file. My context has __path="/appfuse"__ rather than ''path="/appfuse.war"'', so I wonder if that matters.
* Reload seems pointless to me, I still have to deploy (copy files to $CATALINA_HOME/webapp) to Tomcat, and when I do this with Ant's &lt;copy&gt; task, Tomcat reloads the app automagically.
* Using these tasks seems like a waste of time - especially since I'm just replacing something that already works for me. Please, someone prove me wrong. And not with points and counterpoints - but by checking out [AppFuse] from CVS and submitting patches. ;-)
At line 88 changed 1 line.
~ [MattRaible]
__NOTE: There are a few things I discovered in this process:__
* If you put a ''context.xml'' file in your WAR's META-INF directory, the __deploy__ task will recognize it and use it. This is the same as defining your context in server.xml or putting an ''appname.xml'' file in $CATALINA_HOME/webapps. In Tomcat 4, this only works with the deploy task. In Tomcat 5, this will work with any war - even if you just drop it into $CATALINA_HOME/webapps.
;:''That's a very slick feature IMO. Now if there was only a way to deploy the JDBC Driver with the WAR and have it auto-deployed to $CATALINA_HOME/common/lib.''
* All these tasks will overwrite your server.xml file in Tomcat 4.1.x. They do create a backup, but if you're having configuration issues after using these, revert back to your original server.xml. I've included a [minimal server.xml|server-minimal-4.1.29.xml] for Tomcat 4.1.29. Also, the war is deployed under the ''$CATALINA_HOME/work/Standalone/localhost/manager'' directory.
* In Tomcat 4.1.x, the ''reload'' target doesn't work with WARs. You have to use "ant stop start" to simulate a reload.
__The good news is that all of the issues that occur in Tomcat 4.1.x are gone in Tomcat 5.__
* In Tomcat 5, the server.xml is __not__ overwritten. The context.xml is extracted where you would expect it ($CATALINA_HOME/conf/Catalina/localhost), and the WAR is deployed (and expanded) to the webapps directory.
* The ''reload'' target works in Tomcat 5 - providing you don't have any non-serializeable attributes in your session.

Back to TomcatAntTasks, or to the Page History.