Wie installiere und konfiguriere ich JSF-Bibliotheken über Maven?

9

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 :

%Vor%

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.

    
scphantm 10.11.2011, 14:41
quelle

1 Antwort

22

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.

Markieren Sie immer die vom Server bereitgestellten Bibliotheken als 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 :

%Vor%

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.

Installation von JSF auf Tomcat

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 .

Siehe auch:

BalusC 10.11.2011, 14:51
quelle