Java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
Я разрабатываю приложение для входа в FB с помощью Javascript и JSF. Я разместил свой код на здесь. Проблема в том, что когда я запускаю свое приложение, оно не показывает страницу JSF, вместо этого оно вызывает следующее исключение:
Nov 28, 2013 7:21:46 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/FacebookLogin] threw exception [javax/servlet/jsp/jstl/core/Config] with root cause
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:344)
at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:153)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
В чем проблема и как ее решить?
Ответы
Ответ 1
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
Как подсказки названия пакета, указанный класс является частью JSTL. Исключением является четкое указание, что файл определения класса указанного класса не может быть найден в пути пути выполнения. То есть файл Config.class
или, по крайней мере, файл JAR, содержащий этот класс, отсутствует в пути к классам времени выполнения webapp.
JSTL обычно уже предоставляется в поле с помощью полноценного контейнера Java EE, такого как TomEE, JBoss AS/EAP/WildFly, Payara/GlassFish, WebLogic и т.д., но не с помощью barebone JSP/контейнеров сервлетов, таких как Tomcat и Jetty. Для них вам нужно будет поставлять JSTL вместе с веб-приложением самостоятельно, точно так же, как и для JSF (который также уже предоставлен ящиком полноценными контейнерами Java EE).
Вы столкнулись с этим исключением, потому что Facelets имеет для <c:xxx>
теги зависимость от JAR файла JSTL-реализации, используя Tomcat, который не отправляет JSTL из коробки. JSTL является отдельной библиотекой, доступной в аромате jstl-1.2.jar. Просто скачайте и отпустите его в своей папке webapp /WEB-INF/lib
вместе с файлом JSF JAR, который вы уже разместили там, и это исключение должно исчезнуть. Пользователи Maven могут достичь этого, добавив следующую зависимость (и выполнив полную перестройку/повторное развертывание):
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
В качестве альтернативы просто замените Tomcat реальным контейнером Java EE.
См. также:
Ответ 2
Я просто хочу добавить свой вклад, если кто-то получит эту ошибку, пытаясь создать модуль springframework-4.0.7-RELEASE для jboss-eap-6.4.0.GA. Мой module.xml
теперь содержит:
<dependencies>
...
<!-- Contains javax.servlet.jsp.jstl.core.Config -->
<module name="javax.servlet.jstl.api"/>
...
</dependencies>