ClassCastException:com.google.appengine.tools.development.ApiProxyLocalImpl 无法转换为 com.google.appengine.tools.development.ApiProxyLocal。

7
我是一名新手,正在开发使用Maven构建的应用并将其部署到Google应用引擎上。我正在使用appengine 1.9.0 和eclipse kepler 4.3。
然而,在我尝试运行应用程序时,出现了错误。根据Chris的博客所述,建议我删除这个JAR包。
appengine-api-labs 
appengine-api-stubs 
appengine-testing

我已经从库中删除了它并尝试使用maven clean,但是错误仍然出现。 以下是我的图书馆。
以下是完整的控制台错误:
WARNING: failed _ah_ServeBlobFilter: java.lang.ClassCastException: com.google.appengine.tools.development.ApiProxyLocalImpl cannot be cast to com.google.appengine.tools.development.ApiProxyLocal
3 20, 2014 2:34:57 午前 com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Failed startup of context com.google.appengine.tools.development.DevAppEngineWebAppContext@87ec13{/,C:\Users\Annette\Desktop\WebCaller\src\main\webapp}
java.lang.ClassCastException: com.google.appengine.tools.development.ApiProxyLocalImpl cannot be cast to com.google.appengine.tools.development.ApiProxyLocal
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.init(ServeBlobFilter.java:55)
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:662)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:250)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:305)
    at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
    at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:79)
    at com.google.appengine.tools.development.Modules.startup(Modules.java:97)
    at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:255)
    at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
    at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:213)
    at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:211)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:211)
    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:277)
    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
    at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:219)
    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:210)

有人能指出问题吗?谢谢。
6个回答

11
我采取了以下步骤来解决问题:
  1. 移除 appengine-api-stubs 和 appengine-testing
  2. 在 Properties 和 Google > App Engine 中,确保选择默认的 "App Engine - 1.9.1"
  3. 在 build path 的 properties 中,移除所有与 GAE v1.9.1 相关的 JAR 文件,然后从 "Add Library" 添加 GAE 库

出乎意料的是,即使我在 WEB-INF/lib 中有 appengine-api-labs,我的本地部署也可以正常工作。

最后,我的 WEB-INF/lib 包含以下文件:

  • appengine-agent.jar
  • appengine-agentimpl.jar
  • appengine-api-1.0-sdk-1.9.1.jar
  • appengine-api-labs-1.9.1.jar
  • appengine-api-labs.jar
  • appengine-endpoints-deps.jar
  • appengine-endpoints.jar
  • appengine-jsr107cache-1.9.1.jar

希望这能有所帮助。对我有用的可能对你也有用。


这不是一个解决方案,适用于那些在他们的项目中实际使用App Engine/datastore单元测试的人 - 单元测试当然是个好主意。 - Andrei Volgin
我使用这些库进行重要的数据转换功能,所以它们破坏服务器是一件遗憾的事情。 - Deleplace
一件疯狂的事情。我已经从构建路径中删除了appengine-stubs,但问题仍然存在。在删除它们之后,问题得到了解决。 - arturvt
我在将我的项目迁移到使用Maven时遇到了这个问题,由于某种原因,我在文件夹“src\main\webapp\WEB-INF\lib”中有appengine-api-stubs和appengine-testing的jar包。我删除了该文件夹中的所有jar包,之后一切正常。 - Jorge P.

1
首先,我尝试了Andrei Volgin提供的解决方案,但对我没有用。然后我从/WEB-INF/lib中删除了appengine-api-stubs.jar,问题得到解决。
总之,我的/WEB-INF/lib文件夹中有appengine-api-libs和appengine-api-testing,而且我只将appengine-api-testing加入了类路径。

1

正确的解决方案是确保您的类路径上只有一个与您的App Engine SDK对应的appengine-testing.jar版本,并且您的类路径上没有appengine-tools-api.jar或在/WEB-INF/lib文件夹中。

如果满足这些条件仍然存在此错误,请从您的类路径和/WEB-INF/lib中删除appengine-testing.jar,然后将其重新添加到您的类路径中。


1
请在本地添加最新的依赖项,清理构建并重新运行即可。我已经成功解决了相同的问题。
请将以下依赖项添加到您的pom.xml文件中。
<dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-testing</artifactId>
        <version>1.9.64</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-stubs</artifactId>
        <version>1.9.64</version>
        <scope>test</scope>
    </dependency>

0

我曾经遇到过这个问题。使用Maven时,我将“test”添加到所有与测试相关的依赖项中以解决此问题。我认为这只是另一种避免类路径中冲突JAR包的方法。


0

基本上,您需要确保将测试范围添加到从目标文件夹中删除的JAR包中。

 <dependency>
      <groupId>com.google.appengine</groupId>
      <artifactId>appengine-testing</artifactId>
      <version>1.9.23</version>
      <scope>test</scope>
</dependency>

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