giovedì 7 febbraio 2008

Compilare un progetto con Ant usando AspectJ in Eclipse

La configurazione di Ant per la compilazione mediante AspectJ non è sempre semplice, in particolare se si usa Ant all'interno di Eclipse. Questo articolo illustrerà brevemente i passi principali per arrivare ad avere un ambiente funzionante. Si fa riferimento a Eclipse 3.3, Ant 1.7, AspectJ 1.5; nel seguito si mostreranno pezzi di un build file completo, che non viene riportato interamente per ragioni di spazio. Le variabili utilizzate sono state nominate in modo da rendere comprensibile la lettura anche senza avere accesso alla loro definizione.

Definizione del Task Ant
All'interno del file di progetto occorre definire il task iajc, che è l'equivalente del task javac normalmente usato in Ant.

<!-- where to find the aspectj jars required for the compilation -->
<property name="aspectj.tools" value="${src.lib.dir}/aspectjtools.jar"> </property>
<property name="aspectj.runtime" value="${src.lib.dir}/aspectjrt.jar" > </property>

<!-- definition of the ant task for the compilation -->
<taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties" classpath="${aspectj.tools}">
</taskdef>


Le prime due proprietà sono definite per comodità e modularità del build file. Si ricordi che per definire il task iajc occorre il jar aspectjtools.jar, mentre per la compilazione degli aspetti occorre il jar aspectjrt.jar (che fornisce accesso alle strutture run-time di AspectJ). Una volta inserita la definizione del nuovo task si può procedere con la compilazione vera e propria. Da notare che non sempre un taskdef permette l'inclusione di elementi annidati, ecco perché a differenza della guida di AspectJ si è definito il classpath come attributo e non come elemento.

Definizione del classpath
E' bene definire un elemento classpath da utilizzare ovunque nel proprio file di build, indipendentement dall'utilizzo o meno di AspectJ. Di seguito vi è un esempio di classpath per un progetto che richiede alcune dipendenze esterne (driver JDBC per PostgreSQL, Hibernate, Log4J, JUnit):

<!-- the classpath with specific libraries required by the project -->
<path id="build.classpath">
<pathelement location="${build.lib.dir}/aspectjrt.jar" />
<pathelement location="${build.lib.dir}/hibernate3.jar" />
<pathelement location="${build.lib.dir}/log4j-1.2.15.jar" />
<pathelement location="${build.lib.dir}/postgresql-8.3-603.jdbc4.jar" />
<pathelement location="${build.lib.dir}/junit-4.4.jar" />
</path>


Task di compilazione
E' giunto ora il momento di inserire il task di compilazione vero e proprio. Il task di compilazione, come già accennato, è chiamato iajc e prevede parametri simili a quelli del task javac. Da notare come ogni attributo path del task iajc possa essere specificato anche come elemento annidato (di tipo pathelement).
Di seguito la definizione del task di un task di compilazione:

<!-- AspectJ compilation of the project -->

<target name="_AspectJCompile" depends="init" description="Compiles the project using AspectJ compiler." >
<iajc srcDir="${src.dir}" destDir="${build.dir}" source="1.5" classpathref="build.classpath">
</iajc>
</target>


E' interessante notare come si faccia riferimento al classpath precedentemente definito e come siano impostati i percorsi sorgente e destinazione per il build. Da notare anche la compatibilità dei sorgenti (attributo source).


Nessun commento: