Login
Cerca all'interno di JavaPortal
Help
Home Page Documentazione Forum Progetti Partner Pubblica!
Documentazione > Tutorial > Tutorial per ANT - Seconda Parte -
Modifica Impostazioni
Hide
Best Practices
EJB
Frameworks
Howto
J2EE
J2ME and Wireless
J2SE
JSP e Servlet
Java Application Server
Java IDE/Tools
Java Media
Java Security
Java Sys Admin
Java e XML
Java e SQL
OpenSource Java
Patterns
Repository
Tesi
UML
Web Services
Slide
White Paper di jws.it
project management
Eventi
Groovy

Hai una tesi in Java?
Tesine preparate
per esami?
Pubblica tutto su
JavaPortal!

Scrivi al nostro staff


Sun-Ibm, matrimonio annullato


Blaise Pascal
È molto più bello sapere qualcosa di tutto, che tutto di una cosa


Implementazione e protezione di Web Services con Oc4j ed Axis


Rss Feed
Home Page
Articoli
News
Forum
Classi

  Visualizza Commenti (0) Aggiungi Commento    
Add to Shortcuts
 
Vota l'articolo
Tutorial per ANT - Seconda Parte -
By Stefano Secondo
13 giugno 2005
Valutazione Acquisita: 30

  Tutorial per ANT - Seconda Parte -

Eccoci alla seconda puntata del tutorial per Ant. Ricordate a che punto eravamo arrivati? Spero di sì, altrimenti non vi resta che sbirciare la fine della prima puntata. Comunque io non vi aspetto e riprendo subito J Dobbiamo modificare il nostro file build.xml in modo che possa compilare i sorgenti appena scaricati. All'uopo aggiungiamo un target chiamato "compila" che contiene il comando "javac".

<project name="MyProject" basedir="." default="saluta">

 

   <target name="compila">

         <javac srcdir="." />

   </target>

   <target name="scarica">

         <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

         <unzip src="example.zip" dest="." />

   </target>

   <target name="saluta" description="Questo serve a salutare.">

         <echo message="Ciao gente!!"/>

   </target>

   <target name="unaltrotarget" depends="saluta" description="Un altro target.">

         <echo>Questo messaggio

               va oltre la prima linea

         </echo>

   </target>

</project>

Questo task ci permette di compilare i sorgenti java del nostro progetto. L'unico parametro obbligatorio è "srcdir", che ci permette di specificare la directory in cui si trovano i nostri file. Proviamo subito questo nuovo comando e vediamo cosa succede.


Fig. 10 Tutorial per ANT 

Il risultato è una bella lista di errori dovuti al fatto che il compilatore non trova le classi referenziate nei nostri sorgenti. Dobbiamo fare in modo che Ant, nel richiamare il compilatore, setti il classpath in modo corretto. Prima, però, abbiamo bisogno di queste classi: si trovano nella J2EE, oppure in JBoss, visto che si tratta di un'application server. Vi consiglio di installare quest'ultimo, così avremo modo anche di testare quello che faticosamente avremo compilato e "deployato" (lo so: questi termini mutuati dall'inglese e italianizzati sono una vera piaga, vi chiedo comunque di sopportare in silenzio :-)
Scaricate JBoss nella versione che viene con Tomcat annesso. Per questi esempi ho scelto JBoss 2.4.4 con Tomcat 3.2.3, preso da www.jboss.org.
Installato JBoss? Spero non serva un tutorial anche per quello! Ora modifichiamo il target "compila" in modo da settare il classpath usato dal compilatore. Lo facciamo attraverso il parametro "classpath" del comando "javac".

<project name="MyProject" basedir="." default="saluta">

 

    <target name="compila" description="Questo serve a compilare." >

      <javac srcdir="."

       classpath="E:\work\JBoss-2.4.4_Tomcat-3.2.3\jboss\client\jboss-j2ee.jar;

       E:\work\JBoss-2.4.4_Tomcat-3.2.3\tomcat\lib\servlet.jar"

      />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Come potete vedere non ho fatto altro che specificare due file jar che contengono le classi a noi necessarie. E' chiaro che dovrete sostituire la stringa "E:\work\JBoss-2.4.4_Tomcat-3.2.3" con il path in cui avete installato JBoss e Tomcat. Ora lanciamo Ant, naturalmente specificando il target "compila".


Fig. 11 Tutorial per ANT

Questa volta tutto è andato bene, anche se (voi forse ancora non lo sapete) non abbiamo fatto le cose in modo pulito. Ma adesso concentriamoci sulla sostanza e rimandiamo a dopo i ritocchi.
Di nuovo, proviamo a rilanciare Ant.


Fig. 12 Tutorial per ANT 

Osservate l'output di Ant nelle due finestre: quello che vorrei farvi notare è che la seconda volta Ant omette di eseguire il task "javac". In effetti Ant scandisce ricorsivamente la directory specificata nel parametro "srcdir" alla ricerca di file java per i quali il relativo file .class non è presente o è meno recente del sorgente. Con questo controllo Ant evita di eseguire del lavoro inutile.
Pensiamo ora a riscrivere in modo più elegante e funzionale il target "compila". Innanzi tutto potremmo elencare i file jar da aggiungere al classpath con questa nuova sintassi.

<project name="MyProject" basedir="." default="saluta">

  

    <target name="compila" description="Questo serve a compilare." >

           <javac srcdir="."

               <classpath>
                 <pathelement location=

                   "E:\work\JBoss-2.4.4_Tomcat-3.2.3\jboss\client\jboss-j2ee.jar"/>
                 <pathelement location=

                   "E:\work\JBoss-2.4.4_Tomcat-3.2.3\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                     

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Possiamo fare di più. Il path di installazione sarebbe bene definirlo una volta sola ed usare questa definizione nel resto del build.xml. Così, se dovessimo cambiare la home directory di JBoss non saremmo costretti a sostituire tutte le occorrenze di quella stringa in tutto il file. Per far questo utilizziamo il task "property", che ci permette di definire un nome ed un valore ad esso associato. E' consuetudine scrivere un target di inizializzazione in cui sono presenti task di tipo "property" e rendere tutti gli altri target dipendenti da questo. Detto, fatto.

<project name="MyProject" basedir="." default="saluta">

  

   <target name="init"  >
      <property name="jboss.home" value="E:\work\JBoss-2.4.4_Tomcat-3.2.3" />
   </target>

    <target name="compila" description="Questo serve a compilare."

    depends="init">

           <javac srcdir="."

               <classpath>
                    <pathelement location=

                       "${jboss.home}\jboss\client\jboss-j2ee.jar"/>
                    <pathelement location=

                       "${jboss.home}\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Notare che non ho usato il parametro "description" per il target "init", cosicché non verrà annoverato tra i task principali, cioè quelli fatti per essere chiamati direttamente dall'utente.
Potremmo anche decidere che la home di JBoss possa essere letta dalla variabile di environment JBOSS_HOME, che l'utente dovrà preventivamente valorizzare prima di lanciare Ant. In questo modo non dovremo editare il file build.xml ogni volta per settare il path di JBoss. Per accedere alle variabili di environment usiamo il task "property" con il parametro "environment" valorizzato. Ad esempio, scrivere:

<property environment="env" />

non fa altro che dare il nome "env" al nostro environment. Una volta eseguito questo task sarà possibile accedere alla variabile JBOSS_HOME, o a qualsiasi altra presente nell'environment, anteponendo la stringa "env.". Ecco come dovrete riscrivere il vostro file build.xml:

<project name="MyProject" basedir="." default="saluta">

  

   <target name="init"  >
         <property environment="env" />
   </target>

    <target name="compila" description="Questo serve a compilare."

     depends="init">

           <javac srcdir="."

               <classpath>
                    <pathelement location=

                       "${env.JBOSS_HOME}\jboss\client\jboss-j2ee.jar"/>
                    <pathelement location=

                       "${env.JBOSS_HOME}\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Ed ora la ciliegina sulla torta: facciamo in modo di controllare se la variabile JBOSS_HOME sia settata o meno. Nel caso non lo fosse Ant si dovrà fermare, avvisando l'utente. Vi avverto che Ant non è un linguaggio di scripting, il che significa che costrutti if-then-else non sono di immediata realizzazione.
Ma procediamo per gradi: innanzi tutto provate ad aggiungere una riga per stampare il valore di env.JBOSS_HOME nel target "init"

<project name="MyProject" basedir="." default="saluta">

  

   <target name="init"  >
         <property environment="env" />

         <echo message="${env.JBOSS_HOME}" />
   </target>

    <target name="compila" description="Questo serve a compilare."

      depends="init">

           <javac srcdir="."

               <classpath>
                    <pathelement location=

                       "${env.JBOSS_HOME}\jboss\client\jboss-j2ee.jar"/>
                    <pathelement location=

                       "${env.JBOSS_HOME}\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Oramai dovreste aver intuito che il valore di una proprietà viene indicato con la notazione {<<nome_proprietà>>}
Lanciamo Ant specificando come al solito il target "compila".


Fig. 13 Tutorial per ANT

Che cosa è successo? La variabile di environment JBOSS_HOME non era settata, e di conseguenza anche la proprietà env.JBOSS_HOME. Ma perché il task "echo" non ha visualizzato una stringa vuota, come era facile intuire? Ebbene, il valore di env.JBOSS_HOME consiste proprio della stringa "${env.JBOSS_HOME}" quando env.JBOSS_HOME non è settata. Si tratta di una regola generale, valida per ogni proprietà, che bisogna tenere presente nello scrivere file di comando per Ant.

Ora ci serve un task che possa valutare delle condizioni. Il task esiste, a partire dalla versione 1.4 di Ant, e si chiama "condition". Attraverso il parametro obbligatorio "property", possiamo indicare il nome di una proprietà da settare nel caso in cui le condizioni elencate all'interno del task siano soddisfatte. Nel caso in cui non lo siano, la proprietà indicata non verrà settata. Ad esempio, il task che segue, imposta la proprietà "a.diverso.da.b" nel caso in cui il valore della proprietà "a" sia diverso dalla proprietà "b".

<condition property="a.diverso.da.b">

  <not>

     <equals arg1="${a}" arg2="${b}" />

  </not>

</condition>

Ritornando al nostro problema, dobbiamo verificare che env.JBOSS_HOME non sia settata, in altri termini dobbiamo verificare che il valore di env.JBOSS_HOME sia uguale alla stringa "${env.JBOSS_HOME}", quindi riscriviamo il nostro task in questo modo:

<condition property="jboss.home.is.set">
  <not>
     <equals arg1="${env.JBOSS_HOME}" arg2="$${env.JBOSS_HOME}" />
  </not>
</condition>

Per indicare letteralmente la stringa "${env.JBOSS_HOME}" in arg2 abbiamo fatto in modo che Ant non interpreti il simbolo "$", come succede in arg1. Per far questo basta usare il simbolo "$$" ed Ant non interpreterà la stringa specificata come qualcosa da sostituire.

Possiamo ora scrivere nel nostro file comandi:

<project name="MyProject" basedir="." default="saluta">

  

   <target name="init"  >
         <property environment="env" />

         <condition property="jboss.home.is.set">
               <not>
                  <equals arg1="${env.JBOSS_HOME}" arg2="$${env.JBOSS_HOME}" />
               </not>
          </condition>

   </target>

    <target name="compila" description="Questo serve a compilare." depends="init"

    if="jboss.home.is.set">

           <javac srcdir="."

               <classpath>
                    <pathelement location=

                       "${env.JBOSS_HOME}\jboss\client\jboss-j2ee.jar"/>
                    <pathelement location=

                       "${env.JBOSS_HOME}\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Come potete osservare, utilizzando il parametro "if" per il task "compila" abbiamo ottenuto il fatto che questo target sarà eseguito solo se la proprietà "jboss.home.is.set" è settata. Proviamo subito:


Fig. 14 Tutorial per ANT

Come potete vedere, dall'output non si evince se il comando "javac" nel target "compila" non è stato eseguito perché JBOSS_HOME non è settata oppure perché "javac" non ha niente da compilare. Miglioriamo le cose e facciamo scrivere ad Ant il sospirato avvertimento.

<project name="MyProject" basedir="." default="saluta">

  

   <target name="init"  >
         <property environment="env" />

         <condition property="jboss.home.is.set">
               <not>
                  <equals arg1="${env.JBOSS_HOME}" arg2="$${env.JBOSS_HOME}" />
               </not>
          </condition>

   </target>
  

   <target name="check_jboss" unless="jboss.home.is.set">
       <echo message="JBOSS_HOME non settata!"/>
   </target>

    <target name="compila" description="Questo serve a compilare."

    depends="init,check_jboss" if="jboss.home.is.set">

           <javac srcdir="."

               <classpath>
                    <pathelement location=

                       "${env.JBOSS_HOME}\jboss\client\jboss-j2ee.jar"/>
                    <pathelement location=

                       "${env.JBOSS_HOME}\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Abbiamo aggiunto il target "check_jboss" che verrà eseguito semprechè la proprietà "jboss.home.is.set" non sia settata. Notate infatti il parametro "unless" usato in questo target. Poi è stato reso il target come precondizione del target "compila", per essere richiamato prima.

Proviamo:


Fig. 15 Tutorial per ANT

Ora facciamo la controprova e settiamo questa benedetta variabile. E riproviamo.


Fig. 16 Tutorial per ANT

Funziona! Non fatevi confondere: il task "javac" non è stato eseguito semplicemente per il fatto che i sorgenti sono già stati compilati.
Spero che a questo punto molti di voi si siano accorti che l'utilizzo del task "condition" è del tutto inutile in questo caso. In effetti avremmo potuto scrivere direttamente:

<project name="MyProject" basedir="." default="saluta">

  

   <target name="init"  >
         <property environment="env" />
   </target>
  

   <target name="check_jboss" unless="env.JBOSS_HOME">
       <echo message="JBOSS_HOME non settata!"/>
   </target>

    <target name="compila" description="Questo serve a compilare."

    depends="init,check_jboss" if="env.JBOSS_HOME">

           <javac srcdir="."

               <classpath>
                    <pathelement location=

                       "${env.JBOSS_HOME}\jboss\client\jboss-j2ee.jar"/>
                    <pathelement location=

                       "${env.JBOSS_HOME}\tomcat\lib\servlet.jar"/>
                </classpath>

           />

    </target>

    <target name="scarica">

           <get src="http://www.javaportal.it/sorgenti/example.zip"

                     dest="example.zip"

                     verbose="true"

                     usetimestamp="true"/>

           <unzip src="example.zip" dest="." />

    </target>

                    

    <target name="saluta" description="Questo serve a salutare.">

           <echo message="Ciao gente!!"/>

    </target>

                    

    <target name="unaltrotarget" depends="saluta" description="Un altro target.">

           <echo>Questo messaggio

                     va oltre la prima linea

           </echo>

    </target>

</project>

Il task "condition" sarebbe stato utile se avessimo dovuto testare più condizioni, ma non era il nostro caso. Ho complicato le cose per avere l'occasione di spiegare qualche cosa in più. Siete arrabbiati per questo? Bene, è un buon segno :) Non mi resta che invitarvi alla lettura del manuale di riferimento di Ant, che troverete all'indirizzo

http://jakarta.apache.org/ant/manual/index.html e darvi appuntamento alla prossima puntata.

Ora io vi ordino di perdere me e di trovare voi; e solo quando mi avrete tutti rinnegato ritornerò tra voi.
[Così parlo Zarathustra - Nietzsche]

Username:
Password:
To sign up for an account, click register... Register
Hide





Powered By



Campagna Anti-IF


Skin


PARTNER
Zio Budda
HostingJava


LICENZA



Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati sotto licenza Creative Commons

Sitemap  © 2002-2004 Copyright Information. Privacy . Today is domenica 1 agosto 2010