3

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

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.jsp 移到单独的.jsp 文件(includement.jsp)中。然后我在 guestbook.jsp 中使用 <%@ include file="/includement.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);
%>

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

4

3 回答 3

1

嗯...这不能回答您的问题,但也许会对其他人有所帮助。

我只是有一个非常相似的情况。在本地工作正常,但在部署时出现文件未找到错误。我去了这个关于静态文件的页面(https://developers.google.com/appengine/docs/java/gettingstarted/staticfiles),这让我开始思考。

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

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

- 编辑 -

说得太早了。它起作用了,又坏了。现在 gae 返回“无法编译生成的 JSP java 文件”。当然在本地工作得很好......

于 2013-07-21T03:37:45.470 回答
0

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

下面是两个示例 JSP,一个主页和一个包含在内:

索引.jsp

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

包含.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 中正确地页面导入类时,这将得到解决:

<%@ 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
于 2015-12-18T15:25:09.473 回答
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");
于 2015-12-14T15:28:58.857 回答