Come utilizzare correttamente OmniFaces in un EAR
-
21-12-2019 - |
Domanda
Voglio usare OmniFaces 1.7 nella mia applicazione Jave EE 7.La mia applicazione è un EAR che contiene JAR e a GUERRA magra.Alcuni dei miei JAR hanno una dipendenza da OmniFaces, quindi l'artefatto OmniFaces deve trovarsi nell'EAR ma non in WEB-INF/lib
nella guerra.
Ecco come appare il mio EAR:
EAR
+-- lib
| +-- [some 3rd party JARs]
| `-- omnifaces.jar
+-- myEJBs.jar
`-- myWAR.war
Detto in questo modo, i convertitori OmniFaces (come GenericEnumConverter
) non sono registrati con JSF e non funzioneranno.Il motivo di ciò è discusso Qui E Qui.Fondamentalmente secondo il Specifiche JSF 2.0 (sezione 11.5.1 Requisiti per la scansione delle classi per le annotazioni), solo le GUERRE WEB-INF/lib
la directory viene scansionata.
Quindi la mia domanda è: come dovrei includere OmniFaces nella mia applicazione?
Includendolo due volte (in EAR/lib
e GUERRE WEB-INF/lib
) potrebbe funzionare ma sembra goffo.L'ho provato qualche tempo fa con RichFaces 4.3.5 (stesso problema) che non ha funzionato ma ha portato a IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter
.
Soluzione
OmniFaces è una libreria di utilità JSF con dipendenze dalle API JSF, EL e Servlet, che normalmente sono disponibili solo all'interno di un WAR, non di un EAR.Inoltre, i tuoi EJB (servizi aziendali in generale) non dovrebbero avere alcuna dipendenza da specifiche API front-end come JSF, EL e API Servlet.Li renderebbe inutilizzabili su altri front-end come JAX-RS, Spring MVC, ecc.
È necessario inserire le librerie di componenti e utilità JSF come OmniFaces e PrimeFaces in WAR, non in EAR.Guarda anche Installazione sezione della home page di OmniFaces:
OmniFaces è progettato come libreria WAR (libreria di frammenti web) e pertanto non può essere posizionato altrove nel percorso di classe runtime dell'app web al di fuori di quello di WAR
/WEB-INF/lib
, come quelli dell'EAR/lib
o anche quello del server o di JRE/lib
.Quando il file JAR di OmniFaces viene smarrito in questo modo, la webapp non sarà in grado di trovare le classi annotate JSF/CDI in bundle con OmniFaces e generare eccezioni correlate a queste durante la distribuzione o il runtime.Per risolverlo, rimetti OmniFaces in WAR/WEB-INF/lib
.