Tag: ant

  • Checkstyle and DetailAST

    If you are running Checkstyle (for checking Java style) and you are stuck with this error:

    checkstyle:
    [checkstyle] Running Checkstyle 6.11.2 on 2324 files
    [checkstyle] Can't find/access AST Node typecom.puppycrawl.tools.checkstyle.api.DetailAST
    

    which is a cryptic error with no whatsoever Google result on how to fix it, stand back: I have the solution!

    You probably have these packages installed in your system:

    % rpm -qa | grep -i antlr
    ant-antlr-1.9.4-9.2.noarch
    antlr-java-2.7.7-103.38.noarch
    antlr-2.7.7-103.38.x86_64
    

    To fix your problem, just remove ant-antlr package from your system.

  • 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!).

  • Apache Ant: Unable to locate tools.jar

    Se Ant si rifiuta di eseguire uno script di compilazione restituendo l’errore “Unable to locate tools.jar.” procedete in questo modo:

    • create la variabile d’ambiente JAVA_HOME (su Windows: Risorse del computer -> Proprietà -> Avanzate -> Variabili d’ambiente -> Nuovo)
    • impostate il valore di tale variabile al PATH del JDK (dipende dal vostro sistema, nel mio caso: C:\Programmi\Java\jdk1.6.0_03)