使用<%@ include file =“/ file.jsp”%>时,不会部署Google App Engine

时间:2013-03-09 10:21:40

标签: google-app-engine jsp jstl

该项目在我的本地计算机上编译并运行完美。每当我尝试部署时,我都会收到此错误:

Unable to update:
com.google.appengine.tools.admin.JspCompilationException: Failed to compile the      generated JSP java files.
at com.google.appengine.tools.admin.Application.compileJavaFiles(Application.java:803)
at com.google.appengine.tools.admin.Application.compileJsps(Application.java:760)
at com.google.appengine.tools.admin.Application.createStagingDirectory(Application.java:592)
at com.google.appengine.tools.admin.AppAdminImpl.doUpdate(AppAdminImpl.java:370)
at com.google.appengine.tools.admin.AppAdminImpl.update(AppAdminImpl.java:53)
at com.google.appengine.tools.admin.AppCfg$UpdateAction.execute(AppCfg.java:1163)
at com.google.appengine.tools.admin.AppCfg.<init>(AppCfg.java:232)
at com.google.appengine.tools.admin.AppCfg.<init>(AppCfg.java:109)
at com.google.appengine.tools.admin.AppCfg.main(AppCfg.java:105)

我搜索了很多内容并应用了我找到的所有可能的解决方案。我确定Eclipse使用的是JDK而不是JRE。我甚至尝试将jdk中的tools.jar放入AppEngineSDK的lib / shared中。什么都没有用,所以我决定尝试另一种方法 - 我使用Guestbook演示作为起点。在未经修改时,Guestbook演示完美展开。但后来我修改了它。我将以下代码从guestbook.jsp移到单独的.jsp文件(includement.jsp)中。然后我使用&lt;%@ include file =“/ includement.jsp”%&gt;在guestbook.jsp中。就是这样。它在我的本地计算机上完美运行。但它不会部署给我上面显示的错误。

以下是我移动的代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="com.google.appengine.api.users.User" %>
<%@ page import="com.google.appengine.api.users.UserService" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory" %>
<%@ page import="com.google.appengine.api.datastore.DatastoreServiceFactory" %>
<%@ page import="com.google.appengine.api.datastore.DatastoreService" %>
<%@ page import="com.google.appengine.api.datastore.Query" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<%@ page import="com.google.appengine.api.datastore.FetchOptions" %>
<%@ page import="com.google.appengine.api.datastore.Key" %>
<%@ page import="com.google.appengine.api.datastore.KeyFactory" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<%
String guestbookName = request.getParameter("guestbookName");
if (guestbookName == null) {
    guestbookName = "default";
}
pageContext.setAttribute("guestbookName", guestbookName);
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user != null) {
  pageContext.setAttribute("user", user);
%>

我现在已经挣扎了一个星期而且我非常绝望。它对我来说没有任何意义,它在本地工作,不会被部署。

3 个答案:

答案 0 :(得分:1)

嗯......这不能回答你的问题,但也许它可以帮助别人。

我的情况非常相似。在本地工作正常,但在部署时我找不到文件错误。我在静态文件上访问了这个页面(https://developers.google.com/appengine/docs/java/gettingstarted/staticfiles),它让我思考。

我的包含文件没有jsp扩展名,并且被应用引擎视为静态文件,因此可以从任何服务器提供。与此相反的是jsp文件仅从一个服务器提供,并且由于包含文件是从jsp页面引用的,因此它们具有相同的约束 - 它们不能是静态文件。当你想到它时,它是有道理的。本地提供的包含文件将按顺序执行,并且不会出现页面创建问题。将这些相同的文件放在其他服务器上,您就会遇到同步问题。将包含文件保持在所服务页面的本地更为有意义。

在我的情况下,我将我的包重命名为jsp扩展,并且效果很好。在你的情况下不是这样,因为你已经有一个jsp扩展 - 这很奇怪。

- 编辑 -

说得太快了。它又起作用了。现在gae返回&#34;无法编译生成的JSP java文件&#34;。当然在当地工作得很好......

答案 1 :(得分:0)

作为一种解决方法,我在包含的页面中进行了以下更改,并且它有效!

  • 导入并包含所有类和库。
  • 在包含页面中声明的变量,通过页面上下文将它们传递给包含的页面。

这可能不是完美的解决方案,但是直到GAE团队才能找到正确的解决方案。

代码段

[index.jsp] ,其中包括add_member.jsp和update_member.jsp

<%@ page import="com.google.appengine.api.blobstore.BlobKey" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.google.appengine.api.images.ImagesServiceFactory" %>
<%@ page import="com.google.appengine.api.images.ServingUrlOptions" %>

// some more application specific code here
<%
long memberId = -1;
if(request.getParameter("MEMBER_ID")!=null) {
  memberId = Long.parseLong(request.getParameter("MEMBER_ID"));
  System.out.println("memberId: "+memberId);
}
// Look at all of our members
  for (Member member : members) {
    pageContext.setAttribute("member_name", member.firstName + " " +     member.lastName);
    if(memberId == member.id) {
      currentMember = member;
      pageContext.setAttribute("current_member",currentMember);
    }
    System.out.println("member.id: "+member.id);


 %>
     <li> <a href="/index.jsp?MEMBER_ID=<%=member.id%>"> 

${fn:escapeXml(member_name)} </a></li>
  <%
      }
    %>
  </ul>
    <%
    }
  %>

</div>
<%
System.out.println("currentMember: "+currentMember);
  if(currentMember == null) {
%>

  <%@ include file="/pages/add_member.jsp" %>

<%
  } else {
    %>

    <%@ include file="/pages/update_member.jsp" %>

    <%
  }
%>

<强> [add_member.jsp]  在这里,我再次导入了必要的库和包,使其在GAE中运行。如果您在本地服务器上运行,则不需要这样做。

<%@ page import="com.google.appengine.api.blobstore.BlobKey" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.google.appengine.api.images.ImagesServiceFactory" %>
<%@ page import="com.google.appengine.api.images.ServingUrlOptions" %>

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<div id="main">
  <%
    String picBlobKey = request.getParameter("blob-key");
    System.out.println("picBlobKey: "+picBlobKey);

<强> [update_member.jsp]  与add_member.jsp中的更改相同。要注意的另一个变化是读取在index.jsp中设置的页面上下文属性“current_member”。通过这种方式,能够共享父页面中使用的变量。

 <%@ page import="com.rotary.server.entities.Member" %>

<%@ page import="com.google.appengine.api.blobstore.BlobKey" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.google.appengine.api.images.ImagesServiceFactory" %>
<%@ page import="com.google.appengine.api.images.ServingUrlOptions" %>

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<div id="main">
  <%
    Member current_member = (Member)pageContext.getAttribute("current_member");

答案 2 :(得分:0)

我不相信包含在另一个JSP中的JSP能够在不导入自己的正确依赖项的情况下进行编译。我无法在任何地方找到这方面的例子。你说这在开发服务器上工作很奇怪。

这是两个示例JSP,一个主页面和一个包含的内容:

<强>的index.jsp

<html>                                                                                                                                                                                                    
<head>
</head>                                                                                                                                                                                           
<body>                                                                                         
    <pre>                                                                                                  
        <%@ page import="java.util.List" %> 
        <%@ page import="java.util.ArrayList" %>                                                                   
        <jsp:include page="include.jsp" />                                                                                           
    </pre>                                                                                                                                                                                                                
</body>                                                                                                                                                                                                                 
</html>

<强> include.jsp

<%
List<String> cats = new ArrayList<String>();                                                                        
cats.add ("Milo");                                                                                             
cats.add ("Dya");                                                                        
for (Object cat : cats) {                                                                                      
   out.println (cat.toString());                                                                               
}                                                                                                           
%> 

通过在浏览器中显示以下内容失败:

HTTP ERROR 500

Problem accessing /. Reason:

    Unable to compile class for JSP: 

An error occurred at line: 4 in the jsp file: /include.jsp
List cannot be resolved to a type
1: <%
2: 
3: 
4: List<String> cats = new ArrayList<String>();
5: cats.add ("Milo");
6: cats.add ("Dya");
7: 


An error occurred at line: 4 in the jsp file: /include.jsp
ArrayList cannot be resolved to a type
1: <%
2: 
3: 
4: List<String> cats = new ArrayList<String>();
5: cats.add ("Milo");
6: cats.add ("Dya");
7: 

在使用JSP的JSP中正确页面导入类时,这已得到解决:

<%@ page import="java.util.List" %>                                                                    
<%@ page import="java.util.ArrayList" %>                                                                                                                
<%                                                                                                            
List<String> cats = new ArrayList<String>();                                                                   
cats.add ("Milo");                                                                                             
cats.add ("Dya");                                                                                            
for (Object cat : cats) {                                                                                      
   out.println (cat.toString());                                                                               
}                                                                                                             
%>

这产生了两只精彩小猫的名字的良好输出,如预期的那样:

Milo
Dya