Maven Archetype per JSF 2, Spring 4 e JPA 2

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:

archetype

Per chi è affezionato alla riga di comando invece, al posto di pochi click basta questo “semplice” comando:

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

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:
archetype-prj-modules

  • [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 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">
...

<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">

...

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!!

Andrea Como

Sono un software engineer focalizzato nella progettazione e sviluppo di applicazioni web in Java. Presso OmniaGroup ricopro il ruolo di Tech Leader sulle tecnologie legate alla piattaforma Java EE 5 (come WebSphere 7.0, EJB3, JPA 1 (EclipseLink), JSF 1.2 (Mojarra) e RichFaces 3) e Java EE 6 con JBoss AS 7, in particolare di CDI, JAX-RS, nonché di EJB 3.1, JPA2, JSF2 e RichFaces 4. Al momento mi occupo di ECM, in particolar modo sulla customizzazione di Alfresco 4 e sulla sua installazione con tecnologie da devops come Vagrant e Chef. In passato ho lavorato con la piattaforma alternativa alla enterprise per lo sviluppo web: Java SE 6, Tomcat 6, Hibernate 3 e Spring 2.5. Nei ritagli di tempo sviluppo siti web in PHP e ASP. Per maggiori informazioni consulta il mio curriculum pubblico. Follow me on Twitter - LinkedIn profile - Google+

  • mauro

    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”.

  • Pio

    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

    • Pio

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