Sono passati ormai più di due anni dal post che spiegava come creare un progetto con JSF, Spring e Hibernate/JPA. E’ arrivato il momento di aggiornarlo a Maven, con tutte le nuove dipendenze!
Un archetipo tutto nuovo
Ovviamente se si parla di migrare il progetto a Maven, non possiamo che partire da un archetipo. Cercando in rete, quello più interessante è lo Spring Knappsack archetype, anche se:
- non è aggiornato alle ultime versioni
- non è diviso in moduli
Tutte cose a cui si può rimediare piuttosto facilmente. Abbiamo quindi deciso di partire da questo archetipo, aggiustate le dipendenze e dividerlo in due moduli (web e services).
Il risultato è quindi un nuovo archetipo Maven che potete usare direttamente da Maven Central aggiornato ad oggi a JSF 2.2 (Mojarra 2.2.5), Spring 4.0.1, JPA 2.1 (Hibernate 4.3.1) e ottimizzato per Tomcat 7.
Creare un nuovo progetto
Come usarlo quindi? Per chi lavora con Eclipse, creare un nuovo progetto Maven è molto semplice: basta selezionare “Maven Project” dal menu dei nuovi progetti e scegliere l’archetipo come in figura:
Per chi è affezionato alla riga di comando invece, al posto di pochi click basta questo “semplice” comando:
[bash]
mvn archetype:generate -DgroupId=mydomain -DartifactId=myproject -Dversion=0.0.1-SNAPSHOT -Dpackage=it.mypackage -DarchetypeGroupId=it.cosenonjaviste -DarchetypeArtifactId=jsf2-spring4-jpa2-archetype -DarchetypeVersion=1.0.3
[/bash]
Voilà! In pochi secondo è tutto configurato!
Struttura del progetto
Da dove cominciare quindi per capire com’è strutturato il nostro nuovo progetto? A differenza dell’archetipo originale “Spring Knappsack”, questo archetipo organizza le risorse in due moduli Maven:
- [projectName]-services: strato di servizi come l’implementazione della business logic e delle connessioni al database.
- [projectName]-web: strato di web presentation, composto da pagine e controller web.
Così possiamo organizzare le risorse in modo più strutturato.
Dove sono i file di configurazione?
File come il web.xml, faces-config.xml e il persistence.xml non hanno bisogno di presentazioni se avete bisogno di questo archetipo. Non ci sono grosse sorprese su dove trovarli:
- i primi due sono nel modulo web in myproject-web/src/main/webapp/WEB-INF
- il terzo nel modulo dei servizi in myproject-services/src/main/resources/META-INF
Il web.xml è configurato per lavorare con la specifica 3.0 di Servlet, il faces-config.xml per JSF 2.2 e il persistence.xml per JPA 2.1
. Da notare che in questi ultimi due file i namespaces sono cambiati:
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
…
[/xml]
[xml]
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
…
[/xml]
Quello che è cambiato in realtà è il dominio: da java.sun.com
a xmlns.jcp.org
… e così si chiude uno degli ultimi riferimenti alla vecchia e cara Sun 🙁
E Spring?
La vera domanda è proprio questa: e i file di configurazione di Spring dove sono? Spring ha i suoi posti canonici e i suoi nomi canonici per i file di configurazione, ma non è così fiscale come i descrittori precedenti.
In Eclipse, se avete gli Spring Tools (che consiglio e che potete installare comodamente dal Marketplace), vi indica già la strada per i file di configurazione:
- myproject-web/src/main/webapp/WEB-INF/spring/application-context.xml: attiva la component scan per i package e include il file di configurazione del necessario per la connessione e la gestione del database.
- myproject-services/src/main/resources/spring/db.xml: definisce i bean come il dataSource o il transactionManager per la comunicazione con il database. Molto probabilmente questo file non cambierà mai: i dati variabili sono contenuti del file di properties associato (db.properties).
Metadati di Eclipse
Questo archetipo è stato creato a partire da un progetto Eclipse (Kepler nello specifico) per cui comprende i metadati per applicare la facet giuste per caratterizzare il progetto nel vostro workspace. Su alcune versioni di Eclipse è capitato che alla creazione del progetti vi fossero degli errori nell’applicazione del facet JPA 2.1: con un paio di project update dal menu Maven si risolve velocemente il problema!
Non resta quindi che augurarvi buon download!!
scusa ma non sono ancora molto pratico con maven,
Ho provato a seguire il tutorial ma quando da eclipse vado al menu maven istall
ottengo il seguente erroe:
http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building web 0.0.1-SNAPSHOT
[INFO] ————————————————————————
[INFO]
[INFO] — maven-enforcer-plugin:1.0:enforce (enforce-maven) @ myprojectJSF2-SPRING4-JPA2-web —
[INFO]
[INFO] — maven-resources-plugin:2.5:resources (default-resources) @ myprojectJSF2-SPRING4-JPA2-web —
[debug] execute contextualize
[INFO] Using ‘UTF-8’ encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO]
[INFO] — maven-compiler-plugin:2.3.2:compile (default-compile) @ myprojectJSF2-SPRING4-JPA2-web —
[INFO] Compiling 2 source files to C:Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-webtargetclasses
[INFO] ————————————————————-
[ERROR] COMPILATION ERROR :
[INFO] ————————————————————-
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[8,16] error: package org.slf4j does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[9,16] error: package org.slf4j does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[18,22] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[3,28] error: package javax.faces.component does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[4,28] error: package javax.faces.component does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[5,26] error: package javax.faces.context does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[6,26] error: package javax.faces.convert does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[7,26] error: package javax.faces.convert does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[10,45] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[9,1] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[12,30] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[12,57] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[22,30] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[22,57] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[18,38] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[14,37] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[15,18] error: cannot find symbol
[INFO] 17 errors
[INFO] ————————————————————-
[INFO] ————————————————————————
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 12.037s
[INFO] Finished at: Sun Aug 17 12:09:15 CEST 2014
[INFO] Final Memory: 12M/29M
[INFO] ————————————————————————
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project myprojectJSF2-SPRING4-JPA2-web: Compilation failure: Compilation failure:
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[8,16] error: package org.slf4j does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[9,16] error: package org.slf4j does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[18,22] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[3,28] error: package javax.faces.component does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[4,28] error: package javax.faces.component does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[5,26] error: package javax.faces.context does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[6,26] error: package javax.faces.convert does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[7,26] error: package javax.faces.convert does not exist
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[10,45] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[9,1] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[12,30] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[12,57] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[22,30] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[22,57] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebcontrollersTaskBackingBean.java:[18,38] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[14,37] error: cannot find symbol
[ERROR] Usersmauroworkspace_jbds7myprojectJSF2-SPRING4-JPA2myprojectJSF2-SPRING4-JPA2-websrcmainjavaitmypackagewebutlsconvertersEmptyToNullConverter.java:[15,18] error: cannot find symbol
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
mi potreste dare una dritta ?
Ciao Mauro,
a giudicare dalle prime voci del log sembra che lanci il mvn install dal progetto web, invece va lanciato sul “parent”, ovvero nel tuo caso su “myprojectJSF2-SPRING4-JPA2”.
ciao Andrea, non riesco a capire perché visualizzo questo errori :
Top
Left Content Right
Bottom
Unable to find resource ./css/default.css
Unable to find resource ./css/tableLayout.css
Unable to find resource ./css/cssLayout.css
la pagina in questione è una Facelets Template, ti lascio anche il codice:
Facelets Template
Top
Left
Content
Right
Bottom
ho risolto proprio ora l’errore era nel percorso che avevo specificato ” ” togliendo il punto prima di ” /css ” non mi dava più errori, ma sarei lieto di avere un tuo parere e qualche consiglio in merito a questo argomento.
Grazie in anticipo Pio ( programmatore junior Java 🙂 e fiero di esserlo).