Nella prima parte abbiamo introdotto AppFuse e abbiamo fatto una veloce analisi tramite mockup dell'applicazione, ma non ci siamo ancora "sporcati le mani" con del codice e men che meno abbiamo visto in azione questo tool, cosa che faremo invece oggi.
AppFuse in azione
Lo stack applicativo che abbiamo scelto per la nostra applicazione JobBoard è così composto:
- Spring Framework: utilizzato per gestire la configurazione dell'applicazione ovvero risorse, componenti, dipendenze fra gli stessi, eccetera;
- Hibernate per gestire la persistenza dei dati;
- MySql come database;
- Spring MVC (un modulo di Spring stesso) come framework MVC per lo strato web.
Sul sito ufficiale di AppFuse è presente la pagina QuickStart, che spiega come partire velocemente con un progetto AppFuse, fornendo anche un comodo strumento per selezionare le tecnologie da utilizzare nel progetto.
Il procedimento spiegato però non è perfetto, ci sono infatti alcuni problemi che si incontrano frequentemente e che, per ovvi motivi di spazio, non sono trattati direttamente nel Quickstart stesso; riportiamo quindi in questa sede i passi da seguire per arrivare ad un progetto funzionante.
Primo passo: assicuratevi di avere installato un JDK versione 5 (numerato come 1.5) oppure 6 (numerato come 1.6). Il progetto può tranquillamente girare sotto Java 7 (1.7), purtroppo però con questo JDK il processo di build ha ancora dei problemi causati dal plugin native2ascii-maven-plugin; questi problemi sono stati segnalati e il plugin è in corso di aggiornamento, nell'attesa però... cercheremo di accontentarci!
Ovviamente l'applicazione girerà normalmente in una JVM 1.7.
Il secondo passo è l'installazione di MySql 5: una qualsiasi versione recente (purché 5.x) andrà bene.
Alcune funzionalità richiedono l'utilizzo di un server SMTP, che di default è configurato come localhost, vedi file src/main/resources/mail.properties
.
Il nostro suggerimento è di utilizzare una versione di XAMPP adatta al vostro sistema (Unix/Win/Mac), questo vi consentirà di installare in un colpo sia MySql che il server SMTP Mercury. Consigliamo inoltre di disabilitare le porte 80
e 443
di Skype perché interferiscono con il server Apache.
Terzo passo: è caldamente consigliato l'utilizzo di un sistema per il controllo delle versioni (Version Control System - VCS) come Subversion (SVN), Git o Mercurial .
Le "coordinate" del progetto
Prima di creare la struttura del progetto dobbiamo stabilire groupId e artifactId del nostro progetto. In piena "filosofia Maven" infatti ogni progetto deve avere un'identificazione ben precisa all'interno di un repository maven, in modo da poter usufruire di vantaggi come gestione delle versioni, delle dipendenze, ereditarietà, e così via.
groupId solitamente coincide con il package di più alto livello nel progetto, mentre artifactId è un nome breve del progetto, adatto ad esempio per creare degli archivi (.zip, .jar, .war, ecc.) per la distribuzione. Nel nostro caso avremo quindi:
- groupId :
it.html.jobboard
- artifactId :
job-board
Apriamo dunque una shell ed eseguiamo questo comando:
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring-archetype -DarchetypeVersion=2.1.0 -DgroupId=it.html.jobboard -DartifactId=job-board -DarchetypeRepository=http://oss.sonatype.org/content/repositories/appfuse
Attenzione: per esigenze di formattazione abbiamo spezzato il comando su più righe, in realtà esso deve stare su una sola riga! Un modo facile per ottenere questo risultato è aprire un editor, copiare e concatenare le singole righe, copiare e incollare nel terminale la (lunga) riga di comando risultante.
Dopo aver lanciato il comando Maven eseguirà diverse azioni (principalmente risolverà e scaricherà dipendenze, eseguirà test, etc), e troveremo una nuova directory: job-board. In questa directory avremo il nostro nuovo progetto, già configurato e (con qualche piccolo intervento) funzionante.
Se state lavorando su Windows dovrete prima aprire il file di configurazione src/main/webapp/WEB-INF/applicationContext.xml
e modificare questa riga:
<entry key="compass.engine.connection" value="target/test-index" />
in:
<entry key="compass.engine.connection" value="ram://index" />
Un'altra modifica alla configurazione (non sempre necessaria) va fatta nel file pom.xml
alle voci <jdbc.username>
e <jdbc.password>
, che devono corrispondere a quelle di un utente amministrativo sul vostro database MySql locale.
È arrivato il momento di eseguire il check-in dei sorgenti nel vostro VCS: fatelo ora.
A questo punto il progetto è pronto per il suo primo build, che sarà molto, molto lungo perché molte delle librerie necessarie non saranno presenti nel repository di Maven, che le dovrà quindi scaricare. Non c'è da preoccuparsi, tutto ciò avviene solo la prima volta che una libreria/versione è presente come dipendenza. Il comando da lanciare è semplicemente:
>> mvn
Il progetto è configurato per eseguire in ordine queste fasi:
- build;
- creazione del DB e popolamento con i dati di test;
- esecuzione dei test unitari;
- impacchettamento in un file job-board-1.0-SNAPSHOT.war
- lancio dell'applicazione in un Tomcat embedded;
- esecuzione dei test di integrazione;
- installazione del progetto nel repository.
Se uno solo di questi passi fallisce il processo di build si interrompe e bisogna capire cos'è andato storto.
Il progetto è ora pronto per essere importato in un IDE, è sufficiente che l'ambiente di sviluppo abbia il supporto a Maven: NetBeans e IDEA ce l'hanno già, Eclipse ha bisogno di plugin esterni come m2clipse o simili.
Proviamo il progetto maven
Quello che non abbiamo detto, e che forse è l'aspetto più intrigante di tutta la faccenda, è che AppFuse ha creato un'applicazione funzionante per noi, con tanto di gestione accessi, persistenza su database e configurazioni varie! Per provarla è sufficiente digitare il comando:
>> mvn jetty:run
Che lancerà il webserver jetty integrato tramite l'apposito plugin di maven utilizzato all'interno del file pom.xml
Purtroppo spesso questo significa ottenere un deludente messaggio java.lang.OutOfMemoryError: PermGen space
; per rimediare è possibile tentare di fornire più memoria a Maven, specificando queste variabili d'ambiente (esempio per Windows):
>> set MAVEN_OPTS=-Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m
Il server Jetty sarà raggiungibile all'indirizzo:
Le prime schermate di prova
Di seguito visualizziamo finalmente alcune schermate dell'applicazione, tanto per avere una idea generale di dove siamo arrivati.
Abbiamo la pagina di login:
Una homepage personalizzata per l'utente loggato:
Una pagina di auto-registrazione:
e non finiscono qui! Sentitevi liberi di giocarci un po', cambiare dati, caricare file eccetera, tanto al prossimo build tutto tornerà tutto come prima. Una cosa che ci siamo dimenticati di far notare è che l'applicazione è già pronta per l'internazionalizzazione, e supporta già una quindicina di lingue!
Sviluppi
Nei prossimi articoli entreremo nel vivo dello sviluppo, utilizzando questa applicazione come base per sviluppare gli use case realizzati come mockup in fase di analisi.