Questa sezione del sito cerca di fornire risposte puntuali ai dubbi e alle domande più comuni che possono sorgere durante e dopo le esercitazioni.
Domande e risposte sono raggruppate per macro-categorie...

...ma non seguono nessun ordine particolare all'interno di ciascuna categoria.

Eclipse

Cos'è Eclipse?
Un ambiente integrato di sviluppo (IDE) che fornisce gli strumenti necessari alla compilazione, l'esecuzione ed il debug di software Java e che è/può essere esteso con numerosi plugin per supportare funzionalità aggiuntive (es: JUnit, Ant, Javadoc, JBoss, Javascript, ....)
Dove posso scaricare Eclipse?
Ad esempio da qui.
Vorrei la stessa versione di Eclipse che c'è in laboratorio. Dove posso trovarla?
E' possibile copiare l'intero direttorio di Eclipse (ad esempio su una chiavetta USB con sufficiente spazio disponibile) e portarlo in qualsiasi altro pc.
Le impostazioni quali le variabili di ambiente sono lette direttamente dal nuovo sistema, mentre quelle personali (librerie definite dall'utente, preferenze di sistema quali il JRE di default o il livello di compatibilità del codice compilato sono invece memorizzate all'interno del direttorio utilizzato per il proprio workspace. Per conservare tali impostazioni è pertanto necessario copiare anche il workspace utilizzato in laboratorio e impostarlo come workspace nel nuovo sistema.
Come posso importare i progetti disponibili su questo sito (in formato zip)?
Dalla barra dei menu di Eclipse, selezionare:
File > Import > (General > ) Existing Projects Into Workspace > Next > Select archive file > Browse > Finish
Attenzione!!! E' sbagliato invece scegliere:
File > Import > Archive file > ...
(serve solo per importare in progetti già esistenti)
Come creo un progetto nuovo e ne imposto le proprietà?
Dalla barra dei menu di Eclipse, selezionare:
File > New > Project > Java Project > ...
Cliccando col destro sul nome del progetto nella vista 'Package Explorer', l'ultima proprietà del menu contestuale permette di accedere a tutte le proprietà del progetto (es: ubicazione dei file sorgenti e di quelli compilati, build path, ...).
Cos'è una vista e cosa una prospettiva?
Semplificando: una vista è una particolare sezione della finestra di Eclipse che contiene un certo tipo di rappresentazione dei dati, mentre una prospettiva è una particolare combinazione di viste che realizza un certo obiettivo.
Ad esempio: la vista Outline mostra la struttura degli elementi dentro un file (di tipo java, xml, ecc...) mentre il Package Explorer mostra la struttura dei progetti in uso e il Navigator mostra i file realmente presenti nei direttori dei vari progetti aperti. Analogamente: la prospettiva Java combina alcune delle viste disponibili nel modo migliore per la scrittura di codice, mentre quella Debug riposiziona alcune di esse e ne aggiunge altre per permettere di seguire efficacemente l'esecuzione passo passo del codice in fase di debug.
Aiuto! Non riesco più a ripristinare la prospettiva iniziale!
Dalla barra dei menu di Eclipse, selezionare:
Window > Reset perspective
Come creo un nuovo package, una nuova classe o una nuova suite di test?
Dalla barra dei menu di Eclipse, selezionare:
File > New > Package oppure Class oppure JUnit Test Case
Come aggiungo le librerie di JUnit al progetto per fare dei test?
Eclipse, normalmente, ha già installati i plugin e le librerie per supportare l'esecuzione di test tramite il framework JUnit. Nonostante questo, i progetti normalmente non comprendono tali librerie (potrebbero in effetti non essere utilizzate se non si scrivono test con JUnit!).
Per aggiungere le librerie di JUnit al build-path del progetto è sufficiente cliccare col destro sul nome del progetto nella vista 'Package Explorer' quindi scegliere...
Build Path > Add Libraries > Junit
In alternativa, all'atto della creazione della suite di test, lo stesso ambiente di sviluppo (Eclipse) chiede se aggiungere tale libreria automaticamente: accettare tale offerta equivale ad eseguire l'operazione appena descritta.
Cos'è ANT? E perchè devo usarlo?
ANT è un tool che permette di eseguire in maniera programmatica un insieme di operazioni, spesso ripetitive, che altrimenti saremmo costretti ad eseguire manualmente (o da console, o attraverso i vari elementi dell'IDE). ANT non fa parte di Eclipse, ma Eclipse lo supporta attraverso una vista dedicata, le relative librerie ed uno specifico editor in grado di evidenziare i vari elementi del linguaggio e fornire funzioni quali auto-completamento, verifica dei percorsi e delle proprietà utilizzate negli script, ecc...
ANT si basa sull'uso di file XML composti (tra le altre possibili cose) da elementi 'target'. Ogni target rappresenta un 'comando' che è possibile fare eseguire all'interprete ANT (es: cliccando su di esso nella vista 'ANT view') e che può essere composto da una sequenza di operazioni (task) al suo interno e/o dipendere dall'esecuzione di altri target, a loro volta composti da altre operazioni.
I file XML di ANT sono spesso detti file di 'build', perchè inizialmente, storicamente, sono stati utilizzati soprattutto per comandare la compilazione e tutti i relativi parametri (es: classpath, output, input, ...). Poichè ANT non dipende da Eclipse o da altri IDE, tali file hanno il vantaggio di essere portabili attraverso diversi ambienti (possono essere eseguiti anche da linea di comando, senza disporre di alcun IDE!) e permettono di eseguire le operazioni da essi descritte in modo uniforme su diverse macchine. Ad esempio, nelle differenti versioni di Eclipse la posizione o il nome di alcuni comandi sovente differiscono e imparare a memoria la sequenza di operazioni da eseguire col mouse per ottenere un certo risultato non è certo la soluzione ottimale. Inoltre, insegnare tali operazioni a un'altra persona - ad esempio per condividere un progetto o per consegnare il tema di esame di questo corso -, costringerebbe ad includere dettagliate spiegazioni su cosa fare per impostare il progetto, eseguire il packaging, il deploy, ecc... I file XML, invece, permettono di fare tutto questo senza bisogno di ulteriori commenti (è sufficiente fornire un'adeguato valore all'attributo 'description' dei vari 'target' presenti). Tali file, inoltre, essendo scritti in XML, sono leggibili anche da un essere umano, non solo da un elaboratore e (presa la dovuta confidenza con la sintassi) sono auto-esplicativi.
Un elenco dei task disponibili per ANT è disponibile qui. I task si dividono in core (disponibili su tutte le versioni di ANT a partire da quella in cui sono stati introdotti, come specificato dal manuale on-line al link precedente) e in optional (eseguibili a patto di importare nel build-path di ANT le relative librerie (ad esempio nel caso dei target di ANT che comandano Tomcat, viene importato nel build-path il path delle librerie dello stesso tomcat, contenenti 'catalina-ant.jar').
Conviene pertanto imparare ad usare ANT, anche senza diventarne esperti (la maggior parte delle operazioni spesso possono essere copiate e incollate dai file di build dei vari progetti, magari apportando solo lievi modifiche).
Build path di ANT e properties. Non ho capito.
Per facilitare il riuso degli script di ANT su diverse macchine, conviene cercare di raggruppare in definizioni di proprietà tutti i valori che potrebbero differire da macchina a macchina (ad esempio i percorsi su file system delle diverse risorse). Una proprietà di nome PROPR non è altro che una coppia nome-valore il cui valore viene richiamato, dentro i target di ANT, tramite la notazione ${PROPR}.
E' possibile definire proprietà sia all'interno dei file di build che in file esterni. Nei file di build di ANT dei progetti scaricabili da questo sito vige la seguende suddivisione delle proprietà:
  1. Struttura del progetto: non cambia da macchina a macchina e pertanto le proprietà che esprimono il path dei vari componenti (codice sorgente, librerie, pagine web, ...) relativo al direttorio radice del progetto sono impostate all'interno dei file di build;
  2. Proprietà del progetto personalizzabili: possono variare da copia a copia di uno stesso progetto (ad esempio per permettere il deploy simultaneo di due differenti versioni) e sono pertanto definite nel file project.properties richiamato dai build file veri e propri.
  3. Percorsi e opzioni relative a ciascuna macchina: descrivono caratteristiche come il percorso dove è installato Tomcat, le sue librerie, il JDK, il nome utente e la password utilizzati per pilotare Tomcat, ecc.... Sono memorizzate nel file environment.properties richiamato dai build file veri e propri.
In laboratorio è consigliabile installare Tomcat sempre nello stesso percorso (es: il desktop o la propria home) e con lo stesso nome di direttorio. In questo modo, un file environment.properties correttamente configurato può essere copiato da un progetto funzionante a tutte gli altri, facilitando e velocizzando i tempi di set up.
Quale JRE per Eclipse (e ANT, di conseguenza)? E quale compliance level?
Su molte macchine in laboratorio, la versione di default di Java è la 1.4.
Per tale motivo, Eclipse sceglie di accettare un livello di compatibilità più basso del 5 e segnala errore in corrispondenza di costrutti quali annotazioni, enhanced for loop o import statici.
Per ovviare a questo problema è necessario impostare il default JRE utilizzando un JDK versione 5 o superiore e settare la 'compliance level' del workspace (ereditata da tutti i progetti, se non diversamente impostata) a 5.0.
Window > Preferences > (sulla sinistra) Java > (sulla sinistra) Installed JRE > (sulla destra) Add (una JDK>5 specificandone il path su file system e un nome a piacere, poi spuntarla come predefinita)
Window > Preferences > (sulla sinistra) Java > (sulla sinistra) Compiler > (sulla destra) Compiler compliance level > 5.0

Nota: ANT eredita da eclipse la JRE in uso, nonostante la proprietà java.home nel file environment.properties (tale proprietà, già settata da Eclipse, non riesce infatti ad essere sovrascritta, in quanto in ANT le proprietà sono write-once-read-many).
J2EE 1.4 API
I progetti di esempio fanno riferimento, per quanto riguarda le classi delle specifiche J2EE, ad una particolare libreria utente, detta J2EE 1.4 API, come visibile cliccando col destro sul nome del progetto e selezionando:
Properties > (sulla sinistra) Java Build Path > (sulla destra) Libraries
Tale libreria, tuttavia, non è normalmente presente in Eclipse, ma deve essere definita dall'utente (e, nel nostro caso, fare riferimento alle librerie di Tomcat):
Window > Preferences > (sulla sinistra) Java > (sulla sinistra) Build Path > (sulla sinistra) User Libraries > (sulla destra) New > (inserire il nome, comprese maiuscole e spazi) J2EE 1.4 API > Ok > (cliccare sulla nuova entry e scegliere...) Add Jars (...dalla sua destra) > selezionare tutti gli archivi .jar in $TOMCAT_HOME/common/lib e $TOMCAT_HOME/server/lib (o $TOMCAT_HOME/lib per chi usa tomcat 6)
I miei menu di Eclipse sono diversi da quelli indicati nelle spiegazioni
Questo, purtroppo, si verifica frequentemente tra versioni differenti dell'IDE. Nonostante le funzionalità siano comunque presenti, potrebbe non essere facile ritrovarle in versioni differenti (l'uso di ANT si è diffuso anche per ovviare, dove possibile, a questi problemi).

Tomcat

Non mi parte. Perchè?
La versione di Tomcat scaricabile dal sito necessita della versione 5 di Java ed è perciò necessario che la variabile di ambiente JRE_HOME sia correttamente impostata al percorso dove è presente il corrispondente JDK. In Windows è sufficiente scrivere da linea di comando l'assegnamento JRE_HOME=path to jdk here e poi eseguire il comando $TOMCAT_HOME\bin\startup.bat. In linux è anche necessario esportare la variabile ai processi figli della shell corrente, quindi digitare anche il comando export JRE_HOME prima di lanciare $TOMCAT_HOME/bin/startup.sh. In alternativa è possibile modificare gli script di avvio (.sh o .bat) aggiungendo tali operazioni una volta per tutte.
All'avvio, Tomcat scrive l'output sul file $TOMCAT_HOME/logs/catalina.out; è necessario assicurarsi che la directory logs esista e se ancora ci sono problemi si deve controllare che tipo di errori riporta il file catalina.out.
Nota: in laboratorio, per motivi non chiariti, alcune macchine non permettono a Tomcat l'utilizzo della porta 8080. In attesa di chiarimenti, la soluzione più rapida è... cambiare postazione.
Ho deployato il mio progetto sotto webapps. Ma non va.
La prima cosa da fare è assicurarsi che i file siano stati effettivamente copiati nella posizione (basta un piccolo errore nei path usati da ANT e la copia avviene con successo, ma nel posto sbagliato!). Se questo è avvenuto correttamente ma il progetto non parte si può guardare nei log (contenuti nel file $TOMCAT_HOME/logs/catalina.out) in cerca dei possibili problemi rilevati, quali errori scrittura dei descrittori XML).
Può inoltre capitare che undeploy e deploy successivi, con errori, mandino in confusione il server. In tal caso si può forzare il reload dell'applicazione (tramite ANT o pagina web di management) o spegnere e riavviare tomcat (extrema ratio!).
Com'era quella cosa dei ruoli e degli utenti?
Senza appoggiarsi a database o direttori esterni, Tomcat supporta comunque un debole modello di autenticazione basato sul riconoscimento dell'appartenenza di un certo utente (identificato da nome utente e password) ad un certo ruolo, così secondo le associazioni contenute all'interno del file $TOMCAT_HOME/conf/tomcat-users.xml).
Ad esempio, gli script di ANT nei progetti scaricabili da questo sito utilizzano un nome utente uguale ad 'admin' e una password uguale a 'tomcat' per autenticarsi come utente appartente al ruolo di 'manager' e comandare il web server. Tali valori sono impostati nel file environemnt.properties di ogni progetto.
Anche le applicazioni web sviluppate da terze parti possono appoggiarsi a tale meccanismo specificando il ruolo accettato all'interno dei propri descrittori NOME_APP.war/WEB-INF/web.xml.

Firefox

Perchè Firefox?
E' disponibile per la maggior parte dei sistemi operativi normalmente utilizzati (MacOS, Linux, Windows, ...), così come anche Opera.
E' open source: problemi e bachi sono risolti con grande velocità, così come rapida è l'introduzione del supporto per nuovi standard e nuove versioni degli standard.
E' estendibile con numerosissimi plugin, a volte solo dilettevoli, a volte realmente utili per lo sviluppo del front-end di applicazioni web.
E Internet Explorer?
E' ancora il più usato. E' giusto comunque provare le cose anche su di esso e assicurarsi che vadano. Anzi. E' sbagliato non farlo.
Il plugin per guardare l'HTML e i CSS...
Si chiama 'Firebug' e si scarica andando al sito degli add-on. Ad esempio si ottiene questo dalla barra dei menu scegliendo:
Strumenti > Componenti aggiuntivi > Scarica estensioni > search: Firebug > Installa

Errori vari

cannot access it.unibo.XXXX [...] class file has wrong version XY.0 should be WZ.0
Questo tipo di errori sono causati da una differenza tra la versione di Java usata per la compilazione della classe incriminata e quella usata per la sua esecuzione a run-time.
Tipicamente, questo si verifica nel tentativo di utilizzare classi di libreria, spesso impacchettate in file .jar, creati da un JDK di versione superiore a quella in uso (ad esempio: utilizzando Java 1.6 in laboratorio e importando i progetti o i file .jar/.war in una macchina con installato solo Java1.5).
Per quanto riguarda il codice di errore, la corrispondenza tra numeri di versione e ambienti Java runtime è la seguente:
  • 50.0 = Java 1.6.x
  • 49.0 = Java 1.5.x
  • 48.0 = Java 1.4.x
Se questo errore si verifica con i progetti scaricati dal sito vi prego di segnalarlo, in modo da poter ricompilare e ripubblicare le eventuali librerie con Java 1.5 (la versione minima richiesta dal corso).
for-each loops / annotations / static imports are not supported
Questo tipo di errori dipende dalla versione del compilatore in uso (sia da ANT che Eclipse, settabile attraverso l'impostazione di una corretta Installed JRE - vedi domande su Eclipse) o del livello di compatibilità del codice utilizzato o del bytecode prodotto (settabili in Eclipse attraverso l'impostazione del Compiler compliance level - vedi domande su Eclipse - e forzabili in ANT nel task javac tramite gli attributi opzionali source e target - non usati nei progetti sul sito).