Java: come scrivere un build.xml di ant per compilare e pacchettizzare (WAR/EAR)

Come sapete, tutti i Java application server (come ad es. Tomcat) richiedono il deploy di un applicativo sottoforma di un pacchetto EAR. Ma come è composto un pacchetto EAR?

Un pacchetto EAR non è altro che un file jar (che a sua volta è un file zip) che contiene al suo interno:

  • un descrittore di deploy, sotto la directory META-INF (application.xml) che contiene informazioni di gestione riguardo all’applicazione in corso di deploy, come il nome, il contextpath, etc.
  • generalmente, contiene un file WAR che contiene, al suo interno, il modulo web J2EE dell’applicazioni.

A sua volta, un file WAR è un file JAR composto da:

  • il file web.xml sotto la directory WEB-INF che definisce la struttura dell’applicazione web.
  • i file compilati (.class) dell’applicazione posti sotto WEB-INF/classes

Risalendo a ritroso, per creare un EAR è necessario:

  1. Compilare i files dell’applicazione;
  2. Spostarli sotto WEB-INF/classes insieme ai files della webapp (jsp, files statici, etc.)
  3. Creare un WAR (jar)
  4. Creare un EAR inglobando anche il meta-descrittore del deploy

Per fare tutto questo è sufficiente usare ant (o meglio maven, ma questo ve lo spiegherò in un altro post!) con diversi target. Vediamo un esempio che ho realizzato:

<?xml version="1.0" encoding="UTF-8"?>
<project name="prjTest" default="main" basedir="./">

<property name="component-name" value="prjTest" />
<dirname property="workspace.path" file="${ant.file.prjTest}/.." />
<dirname property="ear.dir" file="${ant.file.prjTest}" />
<property name="target.dir" value="${ear.dir}/target" />
<property name="deploy.dir" value="${ear.dir}/deploy" />
<property name="deploy.file" value="prjTest.ear" />

<target name="init">
<mkdir dir="${target.dir}/classes" />
<mkdir dir="${deploy.dir}" />
</target>
<target name="clean">
<delete dir="${target.dir}" />
<delete dir="${deploy.dir}" />
<delete dir="${workspace.path}/prjTest/WebContent/WEB-INF/classes" />
</target>

<path id="myclasspath">
<fileset dir="${workspace.path}/prjTest/WebContent/WEB-INF/lib">
<include name="**/*.jar" />
</fileset>
</path>

<target name="main" depends="clean,init">
<javac srcdir="${workspace.path}/prjTest/JavaSource" destdir="${target.dir}/classes" includes="**/*.java"
source="${source}" target="${target}"
classpathref="myclasspath">
</javac>

<copy todir="${workspace.path}/prjTest/WebContent/WEB-INF">
<fileset dir="${target.dir}">
<include name="**/*" />
<exclude name="**/.metadata/*" />
</fileset>
</copy>
<copy todir="${workspace.path}/prjTest/WebContent/WEB-INF/classes">
<fileset dir="${workspace.path}/prjTest/JavaSource">
<include name="**/*.properties" />
</fileset>
</copy>

<war destfile="${target.dir}/prjTest.war" webxml="${workspace.path}/prjTest/WebContent/WEB-INF/web.xml">
<fileset dir="${workspace.path}/prjTest/WebContent" />
</war>

<ear destfile="${deploy.dir}/prjTest.ear" appxml="${workspace.path}/prjTest/META-INF/application.xml">
<fileset dir="${target.dir}" includes="*.jar,*.war" excludes="**/.metadata/*" />
</ear>
</target>
</project>

Come potete vedere il target chiamato “main” si occupa di:

  • compilare tutte le classi del progetto (javac) usando il classpath di riferimento
  • copiare i files di configurazione (come il già menzionato web.xml) sotto /WEB-INF (copy)
  • copiare i compilati delle classi sotto /WEB-INF/classes (copy)
  • creare un archivio WAR (war) usando i files specificati in fileset e usando il web.xml specificato sotto webxml
  • creare un archivio EAR (ear) usando i files specificati in fileset usando il meta-application specificato in appxml e copiando i files da fileset.

Questo è lo scheletro di build.xml che uso per pacchettizzare velocemente un’applicazione J2EE (infatti basta lanciare ant build.xml main) da linea di comando per compilare, copiare tutti i files necessari e creare WAR ed EAR!).

4 thoughts on “Java: come scrivere un build.xml di ant per compilare e pacchettizzare (WAR/EAR)”

Leave a Reply