Arkiv för 'Tomcat'

Stoppa Tomcat ”med våld”

Postat av Ulf den 18 januari, 2010, i Java, Linux, Tomcat, Webbutveckling.

Ibland hänger sig Tomcat, och hur man än försöker går den inte att stanna. Med kommandot

ps -ef | grep "tomcat"

kan man se om det finns någon Tomcat-process kvar efter det att man försökt stoppa servern. Skulle så vara fallet, kan man med kommandot

kill -9 tomcat

stoppa Tomcat med våld.

  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Live
  • Twitter
  • StumbleUpon
  • Yahoo! Bookmarks
  • RSS

Dynamiskt deployment med Ant på Tomcat

Postat av Ulf den 21 april, 2009, i Java, Tomcat, Webbutveckling.

Det finns en mycket smidig möjlighet att via Ant installera och ladda om Java-webbapplikationer på Tomcat. Man definerar helt enkelt Ant-targets som installerar webbaplikationen via Tomcats manager.

Konfigurera Ant

För att detta skall fungera måste man
1. först kopiera filen catalina-ant.jar från Tomcats lib-katalog till Ants lib-katalog
2. definera en manager-användare Ant kan använda sig av i Tomcats användarfil /conf/tomcat-users.xml, till exempel så här:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <user username="ant" password="ant_password" roles="manager"/>
</tomcat-users>

3. lägga till nya targets i Ants build.xml, till exempel så här:

<!-- Konfigurera build-katalogen -->
<property name="build"    value="${build.dir}"/>

<!-- Konfigurera sökvägen för applikationen (context path) -->
<property name="path"     value="/myContextPath"/>

<!-- Konfigurera access till Tomcats manager -->
<property name="url"      value="http://localhost:8080/manager"/>
<property name="username" value="ant"/>
<property name="password" value="ant_password"/>

<!-- Konfigurera de tasks som man vill köra mot managern -->
<taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask"/>
<taskdef name="reload"    classname="org.apache.catalina.ant.ReloadTask"/>
<taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"/>
<taskdef name="remove"  classname="org.apache.catalina.ant.RemoveTask"/>

<!-- Konfigurera targets. -->
<!-- Detta exempel förusätter att det finns ett target "war" som bygger den war-fil som skall deployas-->
<target name="deploy" description="Install web application"
        depends="war">
<deploy url="${url}" username="${username}" password="${password}"
        path="${path}" war="file:${build}${war}"/>
</target>
<target name="reload" description="Reload web application"
        depends="war">
<reload  url="${url}" username="${username}" password="${password}"
         path="${path}"/>
</target>
<target name="undeploy" description="Remove web application">
<undeploy url="${url}" username="${username}" password="${password}"
                path="${path}"/>
</target>
<target name="remove" description="Remove web application">
<undeploy url="${url}" username="${username}" password="${password}"
                path="${path}"/>
</target>

Därefter skall det gå att via

ant deploy

bygga applikationen och installera den på Tomcat, utan att behöva starta om servern.

Problem 1: Låsta JARs

Ett problem jag stötte på var att vid ett

ant undeploy

blev en del jar-filer hängande kvar i applikationens lib-katalog. Tomcat låser dessa när applikationen exekveras, och tas därför inte bort vid ett undeploy. ant deploy misslyckas med följande felmeddelande:

[deploy] FAIL - Application already exists at path /myContextPath

Man måste därför tala om för Tomcat att inga filer får låsas. Detta görs genom att man i katalogen META-INF (ligger i samma katalog som WEB-INF) lägger till en fil context.xml med följande innehåll:

<Context antiJARLocking="true" antiResourceLocking="true">
</Context>

En nackdel med det här är att Tomcat sedan inte märker när en fil uppdateras, och laddar den dynamsikt på nytt. Gör inget i en produktionsomgivning, men stör under utvecklingen.

Problem 2: ClassCastException

Ett annat problem jag stötte på vid

ant reload

var att applikationen inte kunde startas på grund av en ClassCastException:

Caused by: java.lang.ClassCastException:
org.apache.xerces.parsers.XML11Configuration cannot be cast to
org.apache.xerces.xni.parser.XMLParserConfiguration

Jag hade Xerces som bibliotek i min applikation. Helt i onödan, visade det sig, jag kunde ta bort det utan att det uppstod några kompilerings- eller runtime-fel. Tydligen krockar Xerces med Tomcats egen XML-parser. Lite lustigt, då jag i Tomcats bibliotek inte kunde hitta någon Xerces. Men efter det att jag tagit bort Xerces och gjort en ant undeploy och en ant deploy funkade allt som det skulle.

  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Live
  • Twitter
  • StumbleUpon
  • Yahoo! Bookmarks
  • RSS