marți, 13 ianuarie 2009

Integrarea unei aplicatii web Struts 2 cu Apache Ant (Integrating a Struts 2 application with Apache Ant / Struts 2 and Apache Ant)

Acest fragment este o continuare la cel din 07 ianuarie 2009 :
"Struts2 Setup – Ghid rapid de utilizare", deci se refera la aplicatii web dezvoltate cu tehnologii Java.

Etapele care apar pe parcursul dezvoltarii si testarii unei aplicatii web, sunt in mare urmatoarele : compilarea surselor, copierea diverselor fisiere de proprietati, resurse, configurare dintr-un director de surse intr-un director de binare, crearea unei arhive web pentru deployment etc.

Vom schita targeturile Apache Ant pentru a intretine o aplicatie web cu necesitatile descrise mai sus.

Un posibil target ar fi unul, in care sa fie setate proprietati precum JAVA_HOME, J2EE_HOME, sau sa fie setate proprietati care sa indice directorul binarelor, directorul surselor etc., in structura de directoare a aplicatiei web.

< target name="init">
< property name="JAVA_HOME" value="C:/Program Files/Java/jdk1.5.0_05"/>
< property name="app.context.root" value="public_html" />
< property name="app.deploy.dir" value="deploy" />
< property name="web.root" value="${app.context.root}/WEB-INF" />
< property name="build.classes.dir" value="${web.root}/classes" />
< /target>

Dupa care, am avea targeturile duale de creare repsectiv stergere a directoarelor de deploy si classes - directorul fisierelor java compilate.

< target name="prepare" depends="init">
< echo>Java Version : ${ant.java.version}
< mkdir dir="${app.deploy.dir}" />
< mkdir dir="${build.classes.dir}" />
< /target>

< target name="clean" depends="init">
< delete dir="${app.deploy.dir}" />
< delete dir="${build.classes.dir}" />
< /target>

Observati ca acest targeturi depind de init, ceea ce inseamna ca init va fi executat inainte, iar variabilele folosite in targeturile prepare si clean vor fi recunoscute.

Cele mai multe aplicatii web au si o librarie de dependinte, jar-uri, iar acestea trebuie incluse in classpath pentru compilare. Iata cum ar putea arata si targetul de compile :

< target name="compile-servlets">
< javac source="1.5" srcdir="${src.dir}" destdir="${build.classes.dir}" deprecation="yes">
< classpath>
< pathelement path="${jdk.libs}"/>
< pathelement path="${j2ee.libs}" />

< include name="*.jar" />
< /fileset>
< /classpath>

< copy todir="${build.classes.dir}">
< fileset dir="${src.dir}" includes="**/*.properties" />
< fileset dir="${src.dir}" includes="**/*.xml" />
< /copy>
< /target>

Acest target nu va fi folosit independent, ci numai impreuna cu init cel putin; altfel, variabilele sale nu vor fi recunoscute.

Iata si un posibil target de creare a arhivei web, care se serveste de taskul war al apache ant :

< target name="war">
< war warfile="${app.deploy.dir}/${war.file}" webxml="${web.root}/web.xml">
< fileset dir="${app.context.root}">
< include name="css/*.*" />
< include name="js/*.*" />
< include name="jsps/*.jsp" />
< /fileset>
< lib dir="${lib.dir}">
< include name="**/*.jar" />
< /lib>
< classes dir="${build.classes.dir}">
< include name="**/*.class" />
< include name="**/*.properties" />
< include name="**/*.xml" />
< /classes>
< webinf dir="${web.root}">
< exclude name="**/web.xml" />
< exclude name="src/**/*.*" />
< exclude name="classes/**/*.*" />
< include name="jsps/**/*.*" />
< include name="**/*.xml" />
< include name="**/*.tld" />
< include name="**/*.wsdd" />
< /webinf>
< /war>
< /target>

Am imaginat o posibila structura de directoare, in care avem fisiere jsp, dar si fisiere javascript (js), precum si stylesheeturi css. In componenta arhivei war vor fin incluse directoarele css, js si jsp din radacina aplicatiei, directorul lib - unde sunt tinute arhivele jar necesare aplicatiei, directorul classes cu binarele aplicatiei, precum si coreul web - aflat in directorul web-inf; sursele java sunt lasate pe dinafara; ele nu sunt necesare in arhiva care va fi deployata pe un server web.
La fel ca la targetul compile-servlets, acesta trebuie utilizat impreuna cu init; acesta este un sablon de creare a targeturilor destul de robust, deoarece obliga programatorul sa apeleze init, clean, prepare, war, ceea ce face ca posibile probleme si intarzieri de dezvoltare datorate unor greseli precum necompilarea surselor, sau pur si simplu neadaugarea unui fisier de configurare unde trebuie, sau folosirea unui director de binare invechit - cu niste binare in neconcordanta cu sursele, sa fie complet eliminate, asigurand un mediu de lucru in care programatorul se poate concentra pe ce are de facut - programare, si nu pe probleme de configurare a spatiului de lucru.

In final, iata si un target care reuneste toti pasii descrisi mai sus :
< target name="rebuild" depends="clean,prepare,compile-servlets,war" description="Rebuild project,deploy war archive" />

Init este apelat implicit de clean; prepare nu va mai apela clean, pentru ca a mai fost apelat de clean.

Pentru un exemplu de aplicatie web Struts2 cu un fisier ant - build.xml complet, reunind tot ce este descris in acest fragment vizitati http://interfeteweb.ro/Products.aspx .

In urmatoarea interventie, voi descrie cum sa integram cu aplicatia Struts 2 o librarie de ajax foarte usor de folosit : ajaxanywhere.

Niciun comentariu: