Ich versuche, eine JSF-basierte Anwendung auf Tomcat 6 zu implementieren. Die Art und Weise, wie mein Build-System eingerichtet wird, enthält keine Bibliotheken, da dieser Server insgesamt 43 Apps bereitstellt. Stattdessen werden die Bibliotheken in einen freigegebenen Bibliotheksordner kopiert und zwischen den Apps geteilt. Bei der Bereitstellung erhalte ich diesen Fehler
%Vor%Nun sehe ich in meiner Recherche, dass dies gelöst werden soll, indem der JSF-Quellcode heruntergeladen und selbst kompiliert wird. Das ist eine schreckliche Lösung in meinem Fall. Das wird bei meinem Team mit den verschiedenen Konfigurationen, mit denen wir zu kämpfen haben, riesige Probleme verursachen. Gibt es dafür eine andere Lösung?
Hier ist mein pom.xml
:
Hier muss es eine Lösung geben. Ich kann nicht für eine Sekunde glauben, dass der Maven, der für JSF verteilbar ist, nur gut zum Kompilieren und nicht gut für den Einsatz ist.
Wenn Sie mit einer "seltsamen" Ausnahme konfrontiert werden, die darauf hindeutet, dass Klassen / Methoden / Dateien / Komponenten / Tags nicht vorhanden oder anders sind, obwohl sie scheinbar explizit in der Webanwendung enthalten sind, wie die unten stehenden,
java.lang.ClassFormatError: Nicht vorhandenes Codeattribut in der Methode, die nicht nativ oder abstrakt in der Klassendatei javax / faces / webapp / FacesServlet
ist
java.util.MissingResourceException: Das Paket javax.faces.LogStrings
konnte nicht gefunden werden
com.sun.faces.vendor.WebContainerInjectionProvider kann nicht in com.sun.faces.spi.InjectionProvider
umgewandelt werden
com.sun.faces.config.ConfigurationException: KONFIGURATION FEHLGESCHLAGEN
Das Tag namens inputFile aus dem Namespace http://xmlns.jcp.org/jsf/html hat eine Null-Handler-Klasse definiert.
java.lang.NullPointerException bei javax.faces.CurrentThreadToServletContext.getFallbackFactory
oder wenn Sie mit einem "seltsamen" Laufzeitverhalten konfrontiert werden, wie zB unterbrochene HTTP-Sitzungen ( jsessionid
erscheint in Link-URLs überall) und / oder defekten JSF-Ansichtsbereich (es verhält sich als Anforderungsbereich) und / oder gebrochene CSS / JS / Bild-Ressourcen, dann ist die Chance groß, dass der Laufzeit-Klassenpfad der Webanwendung durch doppelte versionierte JAR-Dateien verunreinigt ist.
In Ihrem speziellen Fall mit FacesServlet
bedeutet dies, dass die JAR-Datei, die die erwähnte Klasse zum ersten Mal enthält, tatsächlich eine "Blueprint" API JAR-Datei ist, die für Implementierungsanbieter gedacht ist (z. B. Entwickler für Mojarra) und MyFaces). Es enthält Klassendateien mit nur Klassen- und Methodensignaturen, ohne Codekörper und Ressourcendateien. Genau das ist "abwesendes Code-Attribut". Es ist ausschließlich für Javadocs und Compilation gedacht.
provided
Alle Abhängigkeiten, die mit " Java-Spezifikationen " in Maven markiert sind und das -api
Suffix in der Artefakt-ID haben, sind diese Blueprint APIs. Sie sollten sie absolut nicht im Klassenpfad der Laufzeit haben. Sie sollten sie immer <scope>provided</scope>
markieren, wenn Sie sie wirklich in Ihrem Pom haben müssen. Ein bekanntes Beispiel ist die Java EE (Web) API :
Wenn der provided
-Bereich nicht vorhanden ist, wird dieses JAR in webapps /WEB-INF/lib
enden und alle Probleme verursachen, denen Sie jetzt gegenüberstehen. Diese JAR enthält auch die Blueprint-Klasse von FacesServlet
.
In Ihrem speziellen Fall haben Sie eine unnötige Abhängigkeit JSF API :
%Vor% Dies verursacht Probleme, da diese die Blueprint-Klasse von FacesServlet
enthält. Entfernen Sie es und verlassen Sie sich auf eine provided
Java EE (Web) API wie oben gezeigt sollte es lösen.
Tomcat als Barebones JSP / Servlet Container bietet bereits JSP, Servlet und EL (und seit 8 auch WebSocket). Sie sollten also mindestens jsp-api
, servlet-api
und el-api
als provided
markieren. Tomcat bietet nur JSF (und JSTL ) nicht an. Also müssen Sie es über die Webapp installieren.
Vollwertige Java EE-Server wie WildFly, TomEE, GlassFish, Payara, WebSphere usw. bieten bereits die gesamte Java EE-API, einschließlich JSF, an. Sie müssen JSF also nicht unbedingt über die Webapp installieren. Es würde nur zu Konflikten führen, wenn der Server bereits eine andere Implementierung und / oder eine andere Version anbietet. Die einzige Abhängigkeit, die Sie benötigen, ist javaee-web-api
genau wie oben gezeigt.
Die korrekte Installation von JSF in Tomcat wird in unserem JSF-Wiki - Installation von JSF erwähnt. Es gibt 2 JSF-Implementierungen, Mojarra und MyFaces . Sie sollten wählen, eine von ihnen zu installieren und somit nicht beide.
Mojarra auf Tomcat installieren:
%Vor% Sie können auch org.glassfish:javax.faces
repository für die aktuellste Release-Version (aktuell% co_de) überprüfen %). Siehe auch Mojarras eigene Installationsanweisungen .
MyFaces auf Tomcat installieren:
%Vor% Sie können auch 2.2.13
repository für die aktuellste Release-Version (die ist derzeit org.apache.myfaces.core:myfaces-bundle
).
Beachten Sie, dass Tomcat 6 als Servlet 2.5-Container maximal JSF 2.1 unterstützt. Vergessen Sie nicht, JSTL nebenbei zu installieren. Siehe auch unser JSF-Wiki - Installation von JSF .
Tags und Links configuration maven tomcat installation jsf