четверг, апреля 15, 2010

Spring, JSP и Caused by: org.apache.tiles.util.TilesIOException: ServletException

Допустим мы имеем:
IDE: Eclipse+Jetty Plugin
Build manager:Maven
Приложение - типа jpetstore из семплов спринга, но с тайлсами. Ну то есть Spring MVC 3.0.x, Tiles 2 как template engine, JSP как view.

И вот правишь на живую JSP с ожданием традиционного хотсвопа, а тебе в ответ:

[btpool0-2] DEBUG o.s.web.servlet.DispatcherServlet - Could not complete request
org.apache.tiles.impl.CannotRenderException: ServletException including path '/WEB-INF/layouts/base.jsp'.
Caused by: org.apache.tiles.util.TilesIOException: ServletException including path '/WEB-INF/layouts/base.jsp'.
Caused by: java.lang.LinkageError: loader constraint violation: when resolving field "deferredExpression" the class loader (instance of runjettyrun/ProjectClassLoader) of the referring class, javax/servlet/jsp/jstl/core/LoopTagSupport, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the field's resolved type, javax/el/ValueExpression, have different Class objects for that type

Дебажишь в tomcat - все нормально, хотсвоп работает как надо - никаких эксепшенов. А именно с Eclipse Jetty plugin проблема. После небольшого исследования все встало на свои места.
Оказывается что в плагине используется Jetty 6.1.6 и в jsp-2.1.jar наличествует org\apache\taglibs\standard - то есть jstl. И в типовом pom.xml (из того же jpetstore) для мавена также имеются строчки зависимости:
        <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>

В итоге мы получаем дублирование jstl и проблему класслоадинга. Так что если вы правите JSP в Jetty, убирайте jstl.

1 комментарий:

Анонимный комментирует...

Спасибо!

Мой список блогов