So nutzen Sie OmniFaces in einem EAR richtig
-
21-12-2019 - |
Frage
Ich möchte benutzen OmniFaces 1.7 in meiner Jave EE 7-Anwendung.Meine Anwendung ist eine EAR, die JARs und a enthält dünner KRIEG.Einige meiner JARs sind von OmniFaces abhängig, daher muss sich das OmniFaces-Artefakt im EAR befinden, aber nicht in WEB-INF/lib
im Krieg.
So sieht mein OHR aus:
EAR
+-- lib
| +-- [some 3rd party JARs]
| `-- omnifaces.jar
+-- myEJBs.jar
`-- myWAR.war
Wenn ich es so ausdrücke: OmniFaces-Konverter (wie GenericEnumConverter
) sind nicht bei JSF registriert und funktionieren nicht.Der Grund dafür wird diskutiert Hier Und Hier.Grundsätzlich gemäß der JSF 2.0-Spez (Abschnitt 11.5.1 Anforderungen für das Scannen von Klassen nach Anmerkungen), nur die WARs WEB-INF/lib
Verzeichnis wird gescannt.
Meine Frage ist also: Wie soll ich OmniFaces in meine Bewerbung einbinden??
Einschließlich zweimal (in EAR/lib
und WARs WEB-INF/lib
) könnte möglicherweise funktionieren, fühlt sich aber ungeschickt an.Ich habe es vor einiger Zeit mit RichFaces 4.3.5 versucht (gleiches Problem), was nicht funktionierte, aber dazu führte IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter
.
Lösung
OmniFaces ist eine JSF-Dienstprogrammbibliothek mit Abhängigkeiten von JSF-, EL- und Servlet-APIs, die normalerweise nur in einem WAR und nicht in einem EAR verfügbar sind.Darüber hinaus sollten Ihre EJBs (Geschäftsdienste im Allgemeinen) keine Abhängigkeiten von bestimmten Front-End-APIs wie JSF-, EL- und Servlet-APIs aufweisen.Dies würde sie auf anderen Frontends wie JAX-RS, Spring MVC usw. unbrauchbar machen.
Sie müssen JSF-Dienstprogramm- und Komponentenbibliotheken wie OmniFaces und PrimeFaces in WAR und nicht in EAR ablegen.Siehe auch Installation Abschnitt der OmniFaces-Homepage:
OmniFaces ist als WAR-Bibliothek (Webfragmentbibliothek) konzipiert und kann daher nicht an anderer Stelle im Laufzeitklassenpfad der Webanwendung außerhalb des WAR-Klassenpfads platziert werden
/WEB-INF/lib
, wie z. B. EARs/lib
oder sogar server- oder JRE-eigene/lib
.Wenn die OmniFaces-JAR-Datei auf diese Weise verlegt wird, ist die Webanwendung nicht in der Lage, mit OmniFaces gebündelte JSF/CDI-annotierte Klassen zu finden und während der Bereitstellung oder Laufzeit keine damit verbundenen Ausnahmen auszulösen.Um das Problem zu lösen, setzen Sie OmniFaces wieder in WARs ein/WEB-INF/lib
.