Когда вы сталкиваетесь со «странным» исключением, предполагающим, что классы / методы / файлы / компоненты / теги отсутствуют или отличаются, в то время как они явно явно включены в веб-приложение, такое как приведенные ниже,
java.lang.ClassFormatError: отсутствует атрибут кода в методе, который не является собственным или абстрактным в файле класса javax / Face / WebApp / FacesServlet
java.util.MissingResourceException: не удается найти пакет javax.faces.LogStrings
com.sun.faces.vendor.WebContainerInjectionProvider нельзя преобразовать в com.sun.faces.spi.InjectionProvider
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED
В теге inputFile из пространства имен http: & # x2f; /xmlns.jcp.org/jsf/html определен нулевой класс обработчика.
java.lang.NullPointerException at javax.faces.CurrentThreadToServletContext.getFallbackFactory
java.lang.AbstractMethodError at javax.faces.application.ViewHandlerWrapper.getWebsocketURL
или когда вы сталкиваетесь со «странным» поведением во время выполнения, таким как прерванные сеансы HTTP (jsessionid
появляется в URL-адресах ссылок повсюду), и / или нарушенная область просмотра JSF (она ведет себя как область запроса), и / или сломанные ресурсы CSS / JS / image, тогда велика вероятность, что путь к классам во время выполнения веб-приложения загрязнен дублирующимися различными версионными файлами JAR.
В вашем конкретном случае с ClassFormatError
на FacesServlet
это означает, что файл JAR, содержащий упомянутый класс, был найден впервые, на самом деле является файлом JAR API "blueprint", предназначенным для поставщиков реализации ( такие как разработчики, работающие на Mojarra и MyFaces). Он содержит файлы классов только с сигнатурами классов и методов, без каких-либо тел кода и файлов ресурсов. Это именно то, что означает «отсутствующий атрибут кода». Он предназначен исключительно для javadocs и компиляции.
Всегда помечать предоставляемые сервером библиотеки как provided
Все зависимости, помеченные " Спецификации Java " в Maven и имеющие суффикс -api
в идентификаторе артефакта, являются этими API-интерфейсами. Вы не должны иметь их в classpath времени выполнения. Вы должны всегда отмечать их <scope>provided</scope>
, если вам действительно нужно иметь их в помпе. Хорошо известным примером является Java EE (Web) API :
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version><!-- 6.0 or 7.0 or newer --></version>
<scope>provided</scope>
</dependency>
Если область действия provided
отсутствует, то этот файл JAR окажется в /WEB-INF/lib
веб-приложения, что вызовет все проблемы, с которыми вы сейчас столкнулись. Этот JAR также содержит классный проект FacesServlet
.
В вашем конкретном случае у вас есть ненужная JSF API зависимость:
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
</dependency>
Это вызывает проблемы, поскольку содержит класс проекта FacesServlet
. Удаление и использование provided
Java EE (Web) API, как показано выше, должно решить эту проблему.
Tomcat, являющийся базовым контейнером JSP / Servlet, уже предоставляет JSP, Servlet и EL (а с 8 также WebSocket) из коробки. Таким образом, вы должны пометить как минимум jsp-api
, servlet-api
и el-api
как provided
. Tomcat только не предоставляет JSF (и JSTL ) из коробки. Поэтому вам нужно установить его через веб-приложение.
Полноценные серверы Java EE, такие как WildFly, TomEE, GlassFish, Payara, WebSphere и т. Д., Уже предоставляют полный API Java EE, включая JSF. Таким образом, вам абсолютно не нужно устанавливать JSF через веб-приложение. Это приведет только к конфликтам, если сервер уже предоставит другую реализацию и / или версию из коробки. Единственная нужная вам зависимость - это javaee-web-api
, как показано выше.
Установка JSF на Tomcat
Правильный способ установки JSF в Tomcat упоминается в нашей вики JSF - Установка JSF . Существует 2 реализации JSF: Mojarra и MyFaces . Вы должны установить один из них и, следовательно, , а не оба.
Установка Мохарры на Tomcat:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version><!-- Check https://javaserverfaces.github.io --></version>
</dependency>
Вы также можете проверить org.glassfish:javax.faces
хранилище для текущей последней версии выпуска (которая в настоящее время 2.2.13
).См. Также Собственные инструкции по установке Mojarra .
Установка MyFaces на Tomcat:
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-api</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-impl</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
Вы также можете проверить org.apache.myfaces.core:myfaces-bundle
хранилище , чтобы узнать последние последниеверсия выпуска (которая в настоящее время 2.2.10
).
Обратите внимание, что Tomcat 6 как контейнер Servlet 2.5 поддерживает максимум JSF 2.1.Кстати, не забудьте установить JSTL.См. Также нашу вики JSF - Установка JSF .
См. Также: