JSTL打破了GoogleAppEngine的开发服务器,但可以在远程服务器上运行

时间:2011-02-17 05:24:56

标签: java google-app-engine jstl

正如标题所说,我的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
  • 没有添加任何地方
  • 没有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 个答案:

答案 0 :(得分:2)

您需要在/WEB-INF/lib或至少在本地开发中使用的servletcontainer的/lib文件夹中删除JSTL JAR。

你应该提取JAR并使用松散的TLD文件来混淆webapp,也不要在web.xml的任何地方引用它。如果你已经完成它,撤消一切。您也不需要手动将其添加到Eclipse构建路径。只需放入/WEB-INF/lib文件夹即可。

另见:

答案 1 :(得分:1)

谷歌搜索没有返回任何有用信息的事实已经表明此问题对我的配置是唯一的。

唉,我终于弄明白了什么是错的,我只是发布解决方案以防有人遇到这个问题,这让我害怕了好几天。

原来我已经将Tomcat的servlet-api.jar和jstl jar添加到Eclipse的默认JRE库中,以避免每次都将它们添加到WEB-INF \ lib中(即Window&gt; Preferences&gt; Java&gt; Installed JREs&gt; ;编辑&gt;添加外部Jar)。

一旦我开始在GAE中开发,这个配置就开始引起与AppEngine自己的servlet-api.jar和jstl jar的冲突。

答案只是从JRE库中删除Tomcat jar。