Arkiv för 'Webbutveckling'

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

Installera och konfigurera Subversion

Postat av Ulf den 3 april, 2009, i Linux, Webbutveckling.

Installation

Att installera Subversion på en linuxmaskin var lättare än jag trott. På min virtuella maskin i Tyskland finns ett OpenSuse 10.1, så med ett enkelt

yast2 --install subversion

laddades Subversion ner och installerades lokalt. Verkligen praktiskt med dessa bibliotek med open-source-program, en stor fördel jämtemot Windows och Mac, där man måste söka på nätet och ladda ner manuellt för att få det man behöver.

Skapa kataloger och repository

Följde därfter instruktionerna på denna sida: How to Setup Subversion

och skapade först katalogen

mkdir /home/svn/

och en svn-användare

useradd svn
passw svn

För att svn-användaren skall kunna ta sig in i den nya katalogen måste man ändra rättigheterna på den:

cd /home
chmod 777 svn

Något som jag som linux-newbie inte är helt förtrodd med, på windows brukar man inte behöva vara så petnoga. Men på en server är det säkert vettigt att hantera rättigheterna så detaljerat.

Bytte därefter användare och gick skapade nödvändiga kataloger:

su svn
cd /home/svn
mkdir repositories
cd repositories

Skapade ett nytt repository kallat myrepos

svnadmin create myrepos

Bara användaren svn skall kunna skriva i repositoryt:

chmod 700 myrepos

Starta Subversion-servern:

svnserve −−daemon −−root /home/svn/repositories

Konfiguration

Gå ner i konfigurationskatalogen:

cd myrepos/conf

Editera konfigurationsfilen:

vi synserve.conf

Texteditorn vi är inte direkt intuitiv i användningen, men man flyttar markören till rätt ställe i texten, och trycker ”i” för att växla till editeringsmodus. Under rubriken [general] ändrar man följande:

Tillåt ingen anonym access:
anon-access = none
Tillåt autoriserad write-access:
auth-access = write
Avkommentera denna rad för att använda standard-lösenordsfil:
password-db = passwd

Tryck <esc> i vi för att lämna editeringsmodus, och skriv in

:wq

för att spara och stänga filen.

Lägg därefter till passande användare genom att editera filen passwd:

vi passwd

Skriv varje användare på en ny rad, enligt schemat

username = password

Arbeta med Subversion

Därefter är det bara att checka ut ett repository lokalt. Antag att man vill checka ut koden i en katalog ”work”:

svn checkout −−username ditt_namn svn://localhost/myrepos work

Ett mera konfortabelt sätt är att använda an lokal klient, som hanterar in- och utcheckning utan att varje gång behöva ange användarnamn och sökväg. TortoiseSVN är en klient för Windows, som integrerar sig med Windows Explorers kontextmeny, dvs man checkar in och ut genom att högerklicka på kataloger och filer i Explorern. Mycket konfortabelt och stabilt.

Arbetar man med Eclipse så är Subclipse ett bra plugin för att kunna checka in och ut utan att behöva lämna Eclipse. Fungerar lika bra som den äldre CVS-integrationen.

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