PDA

View Full Version : Come usare Apache Ant


Krusty93
24-11-2014, 20:28
Buonasera a tutti.

Devo portare a termine un progetto universitario, scritto in Java accompagnato da Eclipse.
Nella traccia del progetto, c'è scritto di presentare "il file di build (targets obbligatori: compile, makedb, javadoc, run) per Apache Ant per compilare il progetto, eseguire i test, lanciare il server e i
client, creare il database, creare la documentazione javadoc, etc".

Ora, visto che è la prima volta che sento parlare di Apache Ant, mi trovo spaesato.
L'ho configurato correttamente, ma non avendo idea da dove iniziare, ho provat a seguire questo tutorial (http://www.vogella.com/tutorials/ApacheAnt/article.html#antexample), che però mi dà qualche problema.

C'è qualcuno in grado di linkarmi qualche guida o spiegarmi le cose indispensabili per compilare il progetto?

Grazie in anticipo

sottovento
24-11-2014, 21:03
Che errori ti da?
Prova a postare il tuo build.xml e gli errori. Dall'esercizio sembra che te lo devi scrivere a mano, ho capito bene?

Krusty93
24-11-2014, 21:19
L'unico riferimento al file di ant nella traccia è quello copiato, quindi direi decisamente di si :D

Ho provato per ora solo sul demo di vogella, prima di cimentarmi sul nostro
Venendo agli errori. Questo il primo

http://i.imgur.com/MSESkOp.png

Ho quindi pensato di creare manualmente la cartella src.

Ho generato poi la javadoc del demo (mi ero dimenticato di farlo), ma i problemi non son finiti

http://i.imgur.com/6UaVQl7.png

Grazie per l'aiuto

EDIT: la riga 33 è
<javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}">

sottovento
24-11-2014, 21:51
Dai, non sei messo male.

L'unico riferimento al file di ant nella traccia è quello copiato, quindi direi decisamente di si :D

Ho provato per ora solo sul demo di vogella, prima di cimentarmi sul nostro (che avrà la javadoc pronta solo domani in quanto se ne sta occupando un altro membro del "team")
Venendo agli errori. Questo il primo

http://i.imgur.com/MSESkOp.png

Ho quindi pensato di creare manualmente la cartella src.

Non hai pubblicato il build.xml, quindi quello che si puo' desumere dall'output e' che in effetti ant non crea quella directory, anche perche' li' dentro ci devi mettere i tuoi sorgenti.


Ho generato poi la javadoc del demo (mi ero dimenticato di farlo), ma i problemi non son finiti

http://i.imgur.com/6UaVQl7.png

Grazie per l'aiuto

EDIT: la riga 33 è

Sulla riga 33 potresti aggiungere:
includeantruntime="false"

dovrebbe essere a posto. Se puoi, pubblica il build.xml cosi' ci diamo un'occhiata. Comunque vai alla grande, magari cambia le directory e non usare quelle dell'uccellino :)

Krusty93
24-11-2014, 22:16
Il file di build utilizzato è identico a quello del sample di vogella :D
Ed è questo

<?xml version="1.0"?>
<project name="Ant-Test" default="main" basedir=".">
<!-- Sets variables which can later be used. -->
<!-- The value of a property is accessed via ${} -->
<property name="src.dir" location="src" />
<property name="build.dir" location="bin" />
<property name="dist.dir" location="dist" />
<property name="docs.dir" location="docs" />

<!-- Deletes the existing build, docs and dist directory-->
<target name="clean">
<delete dir="${build.dir}" />
<delete dir="${docs.dir}" />
<delete dir="${dist.dir}" />
</target>

<!-- Creates the build, docs and dist directory-->
<target name="makedir">
<mkdir dir="${build.dir}" />
<mkdir dir="${docs.dir}" />
<mkdir dir="${dist.dir}" />
</target>

<!-- Compiles the java code (including the usage of library for JUnit -->
<target name="compile" depends="clean, makedir">
<javac srcdir="${src.dir}" destdir="${build.dir}">
</javac>

</target>

<!-- Creates Javadoc -->
<target name="docs" depends="compile">
<javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}">
<!-- Define which files / directory should get included, we include all -->
<fileset dir="${src.dir}">
<include name="**" />
</fileset>
</javadoc>
</target>

<!--Creates the deployable jar file -->
<target name="jar" depends="compile">
<jar destfile="${dist.dir}\de.vogella.build.test.ant.jar" basedir="${build.dir}">
<manifest>
<attribute name="Main-Class" value="test.Main" />
</manifest>
</jar>
</target>

<target name="main" depends="compile, jar, docs">
<description>Main target</description>
</target>

</project>


Infatti mi chiedevo cosa bisogna adattare al proprio progetto nel file xml

Krusty93
24-11-2014, 22:24
Ho aggiunto il nodo indicato da te ed inserito i sorgenti .java nella cartella src (de.vogella.build.ant.first\src\test\src).
Questi gli errori

http://i.imgur.com/YNIaLZ2.png

sottovento
24-11-2014, 22:51
Il file di build utilizzato è identico a quello del sample di vogella :D
Ed è questo
...

Infatti mi chiedevo cosa bisogna adattare al proprio progetto nel file xml

Praticamente nulla, se intendi usare le stesse directory.
Lui definisce le directory in alcune variabili (come se fossero variabili d'ambiente in uno script):


<property name="src.dir" location="src" />
<property name="build.dir" location="bin" />
<property name="dist.dir" location="dist" />
<property name="docs.dir" location="docs" />


Quindi in src ci metti i tuoi sorgenti (organizzati in maniera "standard Java", vale a dire con le directory corrispondenti ai package).
In bin ci vanno a finire i .class e dist conterra' la tua distribuzione. Naturalmente docs conterra' la documentazione javadoc.

Se questa organizzazione delle directory ti va bene, non cambiare nulla.

Quando dalla linea di comando scrivi:
ant
(senza nessun parametro),
il target di default viene controllato. Qual e' il target di default?
Questo:

<project name="Ant-Test" default="main" basedir=".">


All'inizio del progetto hai detto che si deve partire da "main"; se invece scrivi il nome del target, lui verra' interpretato per primo.

Ok, salti al target "main":

<target name="main" depends="compile, jar, docs">
<description>Main target</description>
</target>


Il target main non fa praticamente nulla, ma dipende dai target compile, jar, docs; quindi questi target verranno controllati per verificare se e' necessario eseguire una compilazione, una compressione in jar e la generazione della documentazione (normalmente preferisco tenere la documentazione fuori dalla catena dei target di compilazione/impacchettamento/copia/deploy/..., perche' preferisco generarla in un secondo momento).

L'unica cosa che devi cambiare e'

<target name="jar" depends="compile">
<jar destfile="${dist.dir}\de.vogella.build.test.ant.jar" basedir="${build.dir}">
<manifest>
<attribute name="Main-Class" value="test.Main" />
</manifest>
</jar>
</target>


quando e' il momento di generare il .jar, lo mettera' nella directory configurata nella variabile dist.dir, ed il nome sara' de.vogella.build.test.ant.jar.
Magari chiamalo Hello.jar, basta cambiare li'.
BTW - puoi anche aggiungere attributi al manifest, in quel punto. Main-class definisce la classe che dovra' essere eseguita quando l'utente fa doppio click sul .jar (o quando impartisce il comando java -jar <nome file>.jar)

sottovento
24-11-2014, 22:55
Ho aggiunto il nodo indicato da te ed inserito i sorgenti .java nella cartella src (de.vogella.build.ant.first\src\test\src).
Questi gli errori

http://i.imgur.com/YNIaLZ2.png

Per evitare l'errore nel build.xml cambia la linea cosi':
<javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false" >

probabilmente lo devi fare anche nel nodo di javadoc.

Per il resto... ehi! Sono errori di Java, devi correggere la tua applicazione, ant non c'entra! :D

Krusty93
24-11-2014, 23:06
Per il resto... ehi! Sono errori di Java, devi correggere la tua applicazione, ant non c'entra! :D

Ma il codice java non ha errori (e ci mancherebbe, è un metodo con una moltiplicazione e un main :asd:). I problemi dovrebbero derivare da come sono organizzati i file all'interno delle cartelle. Di questo me ne occupo io.

Grazie per la dritta, domani mi studio con calma ciò che mi hai scritto e provo a scrivere il file build.xml direttamente nel progetto universitario.

A domani :D :D

sottovento
24-11-2014, 23:12
Veramente non trova la classe MyMath... l'hai messa nel posto giusto?

Krusty93
25-11-2014, 17:47
Ciao!
Allora, ho fatto progressi, utilizzando il mio progetto e abbandonando il demo.

Il file di build è questo (https://dl.dropboxusercontent.com/u/62914648/build.xml)
La struttura del progetto è questa (https://dl.dropboxusercontent.com/u/62914648/Capture.PNG)
L'intoppo si ha alla riga 70, alla creazione del target "run" per il client e il server.

Parlando di Server
Il percorso fisico è:
D:\EclipseWorkspace\RMIServer\bin\com\server per i file compilati e D:\EclipseWorkspace\RMIServer\src\com\server per i sorgenti.

L'errore è "Could not find or load main class Server".
Mi sono accorto poi che se provo ad avviare il main della classe Server (contiene solo il main che instanzia il server vero e proprio) da cmd, mi da lo stesso errore. Nel Path di sistema è gia presente il percorso fino a jdkXXX\bin.

L'output del run di build.xml è questo

http://i.imgur.com/Xj2WCz5.png


Per il Client discorso a parte.
Nel main della classe ClientSignIn (con GUI) viene chiamato un metodo della classe Connection per stabilire la connessione. Quindi probabilmente è un errore mettere nel file di build Connection anziché ClientSignIn. Tuttavia non mi son posto il problema visto che voglio prima risolvere con il server, che ha una struttura più semplice

Grazie

sottovento
25-11-2014, 19:18
L'errore è "Could not find or load main class Server".
Mi sono accorto poi che se provo ad avviare il main della classe Server (contiene solo il main che instanzia il server vero e proprio) da cmd, mi da lo stesso errore.
Per prima cosa devi riuscire a farlo partire da cmd. Immagino che tu ci stia riuscendo mentre scrivo questo post.

Ad ogni modo: immagino, visto che sotto src hai creato la directory com, che tu abbia raggruppato le tue classi in un package, per esempio
com.sottovento.
Non conosco esattamente il nome del tuo package, ma se hai creato la directory com, allora deve PER FORZA cominciare cosi'. Se non e' il tuo caso, devi rimuovere questa directory e mettere quella giusta.

Per verificare, prova cosi': supponendo che la classe Server sia nel package com.sottovento, dovra' esserci necessariamente la directory sottovento all'interno della directory com. La directory sottovento conterra' poi il file Server.class.

Se sei in queste condizioni, apri cmd e spostati nella cartella bin; dopo di che scrivi:
java com.sottovento.Server

Ho dettagliato tutti i passaggi, chiedo scusa se sei un utente esperto e la cosa ti sembra triviale. L'errore comunque dice che non ha trovato la classe Server...

Una volta che questo funziona, puoi cambiare ant in accordo

Krusty93
25-11-2014, 19:39
AIuto prezioso il tuo.

Ho difatti provato a spostarmi nella cartella bin, e poi scrivere java com.server.Server e non ha dato più l'errore di prima.

Precedentemente mi spostavo direttamente nella cartella server e da li chiamavo direttamente java Server.

La struttura te l'ho mandata nel post precedente, da li puoi vedere tutte le parti che ci interessano :D
Ti rimetto il link: https://dl.dropboxusercontent.com/u/62914648/Capture.PNG

Tuttavia, non avvia il tutto in quanto non trova l'interfaccia IRemoteRmi che non si trova né nello stesso package, né nello stesso progetto (se guardi lo screen precedente lo trovi in Models/src/com.interf).

In Eclipse tutti i vari progetti comunicano attraverso una reference: per Ant come dovrei fare?

sottovento
25-11-2014, 20:18
In Eclipse tutti i vari progetti comunicano attraverso una reference: per Ant come dovrei fare?

Non conosco Eclipse, normalmente uso Netbeans. Netbeans ha la possibilita' di mettere nel proprio progetto un riferimento ad un altro progetto, ed immagino che sia la stessa cosa per Eclipse, e che i reference non siano altro che i .jar ottenuti compilando i progetti referenziati.

Se cosi' fosse, potresti risolvere la cosa creando un nuovo nodo in build.xml che va a copiare i .jar che ti interessano, e che poi devi mettere nel tuo path.

Ora sono al lavoro, posso dedicarti solo pochi minuti.
Ti metto qui un file ant che ho scritto per fare la stessa cosa su un mio progetto, spero ti possa servire per riferimento. Potrai notare che vado ad aggiungere le librerie jar al path, copiare i file, creare il .jar finale:


<project name="ConfTag" default="dist" basedir=".">
<description>
LogTools - Tag configuration application
</description>

<property name="radix" location="." />
<property name="distPath" value="com/sottovento/conftag" />
<property name="package" value="conftag" />
<property name="src" location="${radix}/source/${distPath}" />
<property name="build" location="${radix}/build/${distPath}" />
<property name="dist" location="${radix}/package_out" />
<property name="lib" location="${radix}/lib" />
<property name="docs" location="${radix}/docs" />
<property name="chk" location="${radix}/chk/${distPath}" />
<property name="conffiles" location="${radix}/config/confTag" />

<!-- Preparing classpath to reach JCLASS libraries, remote spy libraries and Application libraries -->
<path id="project.class.path">
<pathelement path="${src}" />
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</path>

<!-- First target, initialising -->
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the directory structure used by compile -->
<delete dir="${radix}/build" />
<mkdir dir="${build}" />
</target>

<!-- Compiling targets -->
<target name="compile" depends="init" description="Compile all the sources" >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${radix}/build">
<classpath refid="project.class.path" />
</javac>
</target>

<!-- Copying the config files in distribution directory. Additional files are required for setup, configuration, ... -->
<target name="copy" description="Copy configuration files into distribution directory" >
<mkdir dir="${dist}/${package}/config" />
<sync todir="${dist}/${package}" >
<fileset dir="${conffiles}" />
</sync>
</target>

<!-- Copy the libraries to distribution directory -->
<target name="copylib" description="Copy the needed libraries into distribution directory" >
<sync todir="${dist}/lib" >
<fileset dir="${lib}" />
</sync>
</target>

<!-- Preparing manifest file -->
<target name="manifest" depends="compile" description="Prepare manifest file" >
<mkdir dir="${build}/META-INF" />
<manifest file="${build}/META-INF/MANIFEST.MF">
<attribute name="Built-By" value="sottovento" />
<attribute name="Company" value="xxxxxxxxxx AG EAI2 Office"/>
<attribute name="Content" value="Tag configuration application"/>
<attribute name="Main-Class" value="com.sottovento.conftag.ConfTag" />
<attribute name="Class-Path" value=" ../lib/liquidlnf.jar" />
</manifest>
</target>

<!-- Preparing distribution -->
<target name="dist" depends="compile, copy, manifest, copylib" description="Code distribution preparation" >
<!-- Create distribution directory -->
<mkdir dir="${dist}/${package}" />

<!-- Put everything in ${build} into the level2.jar file -->
<jar destfile="${dist}/${package}/conftag.jar"
basedir="${radix}/build" manifest="${build}/META-INF/MANIFEST.MF" >
<include name="**" />
<exclude name="META-INF/**" />
<exclude name="/build.xml" />
</jar>

<!--
<sync todir="${dist}/${package}/lib" >
<fileset dir="${dist}/lib" />
</sync>
-->
</target>

<!-- Target for cleanup build directories -->
<target name="clean" description="Clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}" />
<delete dir="${dist}/${package}" />
<delete dir="${build}/META-INF" />
</target>

<!-- Target for javadoc generation -->
<target name="doc" description="Generate Javadoc documentation" >
<mkdir dir="${docs}/${distPath}" />

<javadoc packagenames="com.sottovento.conftag.*"
sourcepath="${src}"
classpathref="project.class.path"
destdir="${docs}/${distPath}"
author="true"
version="true"
use="true"
private="true"
windowtitle="Conftag API documentation" />
</target>
</project>