该项目在我的本地计算机上编译并运行完美。每当我尝试部署时,我都会收到此错误:
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);
%>
我现在已经挣扎了一个星期而且我非常绝望。它对我来说没有任何意义,它在本地工作,不会被部署。
答案 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