AppEngine - 无法编译JSP类

7
我正在使用一个创建留言板Web应用程序的教程,但每当我尝试连接到 localhost:8080 时,就会出现以下错误:

无法连接到服务器。 确保您已经运行了服务器并且端口号正确。

  HTTP ERROR 500

Problem accessing /. Reason:

    Unable to compile class for JSP: 

An error occurred at line: 1 in the generated java file
The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files

Stacktrace:
Caused by:

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 1 in the generated java file
The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files

Stacktrace:
    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:349)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:327)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:314)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
    at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:61)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:58)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
    at com.google.appengine.tools.development.StaticFileUtils.serveWelcomeFileAsForward(StaticFileUtils.java:82)
    at com.google.appengine.tools.development.LocalResourceFileServlet.maybeServeWelcomeFile(LocalResourceFileServlet.java:260)
    at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:120)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:59)
    at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:49)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:502)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

我正在使用Apache Maven 3.3.9版本和jdk1.8.0_92。我能成功执行“mvn appengine:devserver”命令,并且收到了“Dev App Server is now Running”的提示。我看到了一些涉及Tomcat的相关问题,但是它们并没有提供太多帮助。由于我正在按照教程进行操作,所以我有些困惑该怎么做。有什么建议可以帮我解决这个问题吗?这里是我正在尝试的链接(请注意,这是一个已经被存档的旧链接)。

这个链接可能会对你有所帮助:https://dev59.com/3GIk5IYBdhLWcg3wdeDY - Sasha
@Sasha,我看到了那篇帖子,但它只是略微相关,不完全相同。他们正在使用Tomcat,这与我所知道的Maven不同,因此他们的解决方案与我的系统不对应(例如jar文件)。 - Noobgineer
你能发一下你的.classpath文件吗? - Sasha
@Sasha,我不知道在哪里找到.classpath文件。我是新手,一直在按照教程操作,但没有提到.classpath文件。 - Noobgineer
6个回答

4
  • 确保mvn -version命令的输出显示Java版本为1.7,例如:
    mvn -version Java version: 1.7.0_101, vendor: Oracle Corporation ...
  • 如果显示的版本为1.8或其他版本,则必须更改PATH环境变量JAVA_HOME指向你的1.7文件夹...这是mvn运行Java的位置,你可以在Linux或Mac终端上使用以下命令进行检查: echo $JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64

[ 在 Windows、Mac 或 Linux 中添加 PATH 的链接 ]

尝试上述步骤并重新执行你的
mvn clean install
mvn appengine:devserver
命令... 希望能帮到你。


4

我和你的问题完全一样。对我而言,在我将JDK从1.8更改为1.7之后,问题消失了(使用JDK 1.8时编译级别为1.7)。我不知道这是否会对你有所帮助。


似乎应用引擎仍不支持jdk8。 - Brimstedt

0

JDK版本需要为1.7。在pom.xml中,SDK版本无需更改。我尝试了所有的SDK版本组合,唯一有效的是将$JAVA_HOME设置为1.7,并将pom.xml中的版本保持不变(1.9.24)。我的初始JDK版本为1.8,应用程序出现“无法编译带有JSP的类”的错误。


0

我遇到了同样的问题,但我有一个观察结果可能有助于解决这个问题。今天早上,我使用Maven原型构建了留言板项目:

mvn archetype:generate -Dappengine-version=1.9.37 ....

在用这种方式创建项目后,立即执行以下操作:

mvn appengine:devserver

Jetty启动并且我可以在浏览器中访问留言板应用程序。

在这个初始成功之后,我尝试在Eclipse中使其工作。在此过程中,我还发现我同时使用了不同的JDK版本,并尝试进行更正。但是在Eclipse中我没有成功。之后我尝试返回到mvn appengine:devserver。只有在那时我才遇到了上述问题。

我尝试删除Maven存储其下载的依赖项的.m2目录。我还尝试使用mvn archetype:generate ...构建新的副本。但这些操作都没有帮助。

我的classpath如下:

[INFO] mei 20, 2016 12:01:11 AM org.apache.jasper.compiler.JspRuntimeContext initClassPath
[INFO] FINE: Compilation classpath initialized: 
/C:/work/Bitbucket/MessageApp3/target/MessageApp3-1.0-SNAPSHOT/WEB-INF/classes/;
/C:/work/Bitbucket/MessageApp3/target/MessageApp3-1.0-SNAPSHOT/WEB-INF/lib/appengine-api-1.0-sdk-1.9.37.jar;
/C:/Users/ABB/.m2/repository/com/google/appengine/appengine-java-sdk/1.9.37/appengine-java-sdk/appengine-java-sdk-1.9.37/lib/impl/agent/appengine-agentruntime.jar;
/C:/work/Bitbucket/MessageApp3/target/MessageApp3-1.0-SNAPSHOT/WEB-INF/lib/guava-18.0.jar;
/C:/work/Bitbucket/MessageApp3/target/MessageApp3-1.0-SNAPSHOT/WEB-INF/lib/jstl-1.2.jar;
/C:/work/Bitbucket/MessageApp3/target/MessageApp3-1.0-SNAPSHOT/WEB-INF/lib/objectify-5.1.5.jar;
/C:/Users/ABB/.m2/repository/com/google/appengine/appengine-java-sdk/1.9.37/appengine-java-sdk/appengine-java-sdk-1.9.37/lib/tools/jsp/repackaged-appengine-jakarta-jstl-1.1.2.jar;
/C:/Users/ABB/.m2/repository/com/google/appengine/appengine-java-sdk/1.9.37/appengine-java-sdk/appengine-java-sdk-1.9.37/lib/tools/jsp/repackaged-appengine-jakarta-standard-1.1.2.jar;
/C:/Users/ABB/.m2/repository/com/google/appengine/appengine-java-sdk/1.9.37/appengine-java-sdk/appengine-java-sdk-1.9.37/lib/tools/jsp/repackaged-appengine-jasper-jdt-6.0.29.jar;
/C:/Users/ABB/.m2/repository/com/google/appengine/appengine-java-sdk/1.9.37/appengine-java-sdk/appengine-java-sdk-1.9.37/lib/opt/tools/appengine-local-endpoints/v1/appengine-local-endpoints.jar;
C:\Users\ABB\AppData\Local\Temp\Jetty_127_0_0_1_8080_MessageApp3.1.0.SNAPSHOT____1qwjqs\jsp;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\appengine-local-runtime-shared.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\el-api.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\jsp\repackaged-appengine-ant-1.7.1.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\jsp\repackaged-appengine-ant-launcher-1.7.1.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\jsp\repackaged-appengine-jasper-6.0.29.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\jsp\repackaged-appengine-jasper-el-6.0.29.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\jsp\repackaged-appengine-tomcat-juli-6.0.29.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\jsp-api.jar;
C:\Users\ABB\.m2\repository\com\google\appengine\appengine-java-sdk\1.9.37\appengine-java-sdk\appengine-java-sdk-1.9.37\lib\shared\servlet-api.jar;
C:\work\Bitbucket\MessageApp3\target\MessageApp3-1.0-SNAPSHOT\classes;
[INFO] mei 20, 2016 12:01:11 AM org.apache.jasper.servlet.JspServlet init
[INFO] FINE: Scratch dir for the JSP engine is: C:\Users\ABB\AppData\Local\Temp\Jetty_127_0_0_1_8080_MessageApp3.1.0.SNAPSHOT____1qwjqs\jsp

我正在使用JDK 1.8.0_91和Maven 3.3.3

编辑:当我写上述内容时,我是在Windows下开发的。2016年5月28日,我在一台32位笔记本电脑上安装了Ubuntu 14。使用i88.ca的答案,我让它工作了。


我刚刚按照你说的尝试了新的Dappengine版本,但对我仍然没有用。不过还是谢谢你的帮助。 - Noobgineer
我尝试了应用引擎版本1.9.25,但它也不起作用。 - Martijn Dirkse
@ Sasha,我有一个类路径。它太长了,无法在评论中添加,因此我将其添加到我的答案中。 - Martijn Dirkse

0
我曾经和你一样遇到了同样的问题,但是所有的答案都没有帮助到我,所以这里是我的解决方案。这个解决方案可以作为一个通用方法来运行适用于JDK 7的Google AppEngine教程,使其在Java 8上同样有效。同时请注意,Google Cloud SDK和Google Cloud Platform是两个不同的安装包。此外,我在实验过程中使用的是Windows 10 x64,仅供参考。

这个问题与您提到的 link 非常相似,但在这种情况下,您的 Jetty 服务器版本不支持 JDK 8。有一篇关于此的 Google 教程 - link。首先我尝试了 Jetty 6.1.x,遇到了与您相同的问题,看到 Jetty 服务器版本不支持 JDK 8(来自 Intellij 2016.1.2 的默认 AppEngine Dev 配置)。后来我尝试了 Jetty 9.3.x,它在 JDK 8 上正常工作。虽然现在我使用 Jetty 服务器 9.3,但我不再使用 appengine:devserver 来模拟用户和 Datastore API,让教程正常工作。所以我转而使用 gcloud 提供的模拟器 - link,但是 gcloud 目前缺少在教程中使用的 Users API 模拟器,该模拟器由 appengine:devserver 提供。有趣的是,当我开始重新实现教程时,我发现其他开发者已经做过了 - link

以下是如何使用Maven 3.3.9、JDK 8、Jetty 9.3和gcloud模拟器运行留言簿教程(最初是为JDK 7设计的)的方法:

  1. [可选] 修复Windows注册表问题 - 链接
  2. 安装Python 2.7 - 链接
  3. 安装Google Cloud Platform - 链接在安装过程中启用beta功能。
  4. 完成这个教程,它是相同的留言簿应用程序,但正确实现了Java 8支持 - 更新的留言簿教程

结论

如果在https://cloud.google.com/appengine/docs上找不到最新的教程,请在github上查找更新的教程。


这种方法是历史性的,因为谷歌转向了 https://cloud.google.com/appengine/docs/flexible/java/。我的回答针对当时未得到很好记录的JDK8使用。 - Constantin Zagorsky

0

我必须添加

<runtime>java8</runtime>

在appengine-web.xml文件中进行必要的配置以使其正常工作。这是基于最新版本的Android Studio构建和最新版本的Appengine Java SDK - appengine-java-sdk-1.9.59

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接