JSTL ломается на сервере разработки GoogleAppEngine, но работает на удаленном сервере - PullRequest
0 голосов
/ 17 февраля 2011

Как видно из заголовка, мои JSTL-теги не работают на моем сервере разработки, но работают на реальном сервере Google.

Я упростил код до голой кости, чтобы убедиться, что в коде нет ничего плохого, поэтому вот что у меня есть.

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Page Title</title>
</head>
<body>
    <c:choose>
        <c:when test="${2+2==4}">sum works</c:when>
        <c:otherwise>sum doesn't work</c:otherwise>
    </c:choose>
</body>

Моя конфигурация выглядит следующим образом (что я считаю правильным и работает на сервере Google): я использую

  • Eclipse IDE
  • Servlet 2.5
  • Нетjstl jar добавлен в WEB-INF \ lib
  • tld нигде не добавлен
  • Нет ссылки на taglib

на web.xml

Однако ятакже пробовал несколько комбинаций из следующих, и ни одна из них не работала:

  • jstl-1.2.jar добавлен в путь сборки
  • c.tld добавлен в WEB-INF
  • ссылка на taglib добавлена ​​в web.xml

Ошибка ниже:

HTTP ERROR 500
Problem accessing /index.html. Reason: 

    javax/servlet/jsp/tagext/TagSupport

Caused by:

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagSupport
    at java.lang.ClassLoader.findBootstrapClass(Native Method)
    at java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:927)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:298)
    at com.google.appengine.tools.development.DevAppServerClassLoader.loadClass(DevAppServerClassLoader.java:87)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at com.google.appengine.tools.development.DevAppServerClassLoader.loadClass(DevAppServerClassLoader.java:87)
         ...

Как ни странно, <c:out value="${blah}"/> работает как на сервере разработки, так и на удаленных серверах.другие основные теги не работают.Если я попытаюсь добавить теги fmt, они тоже не будут работать.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Вам необходимо удалить JSTL JAR в /WEB-INF/lib или хотя бы в папке /lib сервлет-контейнера, который вы используете для локальной разработки.

Вы должны не извлекатьJAR и загромождают веб-приложение свободными TLD-файлами, а также не ссылаются на него где-либо в web.xml.Отмените все, если вы сделали это.У вас также не должно быть необходимости вручную добавлять его в путь сборки Eclipse.Достаточно просто вставить папку /WEB-INF/lib.

См. Также:

1 голос
/ 22 февраля 2011

Тот факт, что поисковые запросы Google не возвращали никакой полезной информации, уже указывал на то, что эта проблема была уникальной для моей конфигурации.

Увы, мне, наконец, удалось выяснить, в чем дело, и я просто выкладываю решение на тот случай, если кто-то столкнется с этой проблемой, которая боялась меня несколько дней.

Оказалось, что я добавил Tomcat servlet-api.jar и jstl jar в библиотеку JRE Eclipse по умолчанию, чтобы избежать необходимости каждый раз добавлять их в WEB-INF \ lib (т.е. Window> Preferences> Java> Installed JREs> Edit> Add Внешний кувшин).

Как только я начал разрабатывать в GAE, эта конфигурация стала причиной конфликта с собственными jar-серверами AppEngine - servlet-api.jar и jstl.

Ответ состоял в том, чтобы просто удалить банки Tomcat из библиотеки JRE.

...