无法使用Google应用引擎显示图片

时间:2012-02-18 11:30:11

标签: java html spring google-app-engine

编辑:这已经开始工作,我没有改变任何东西,这是我第二次遇到这个问题,我的应用程序工作了一段时间,然后突然停止工作。 GAE在Spring方面是不可靠的吗?还有其他人遇到类似的GAE问题吗?

我无法在jsp页面上显示动画gif。 gif在本地显示但是当我在app引擎服务器上放置时会抛出错误。这是我的设置:

我在appengine-web.xml中添加了图片目录:

  

<static-files> <include path="/images/**.*" /> </static-files>

我的项目结构:

enter image description here

I load the image using html code : `<img src="/images/ajax-loader.gif"/>`

但我收到错误:

enter image description here

java.lang.NoSuchMethodError:在管理控制台中被抛出,但我看不出这与加载gif图像有什么关系? 使用的gif取自http://www.ajaxload.info/&amp;指标类型是“指标”

java.lang.NoSuchMethodError: org.springframework.jndi.JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()Z
    at org.springframework.web.context.support.StandardServletEnvironment.customizePropertySources(StandardServletEnvironment.java:85)
    at org.springframework.core.env.AbstractEnvironment.<init>(AbstractEnvironment.java:101)
    at org.springframework.core.env.StandardEnvironment.<init>(StandardEnvironment.java:54)
    at org.springframework.web.context.support.StandardServletEnvironment.<init>(StandardServletEnvironment.java:43)
    at org.springframework.web.servlet.HttpServletBean.<init>(HttpServletBean.java:90)
    at org.springframework.web.servlet.FrameworkServlet.<init>(FrameworkServlet.java:211)
    at org.springframework.web.servlet.DispatcherServlet.<init>(DispatcherServlet.java:303)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at java.lang.Class.newInstance0(Class.java:372)
    at java.lang.Class.newInstance(Class.java:325)
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    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 com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)

外部库: enter image description here

5 个答案:

答案 0 :(得分:3)

NoSuchMethodError 几乎总是由于使用不兼容的库版本而导致的。在这种情况下,您可能正在使用不同版本的Spring库。例如 spring-web-3.1.0.jar spring-context-3.0.x.jar 。因此,尝试将所有Spring jar更新为上一版本。

如果您告诉我们您使用的是哪个版本,我们可以为您提供更多帮助。

编辑: pom.xml中的Spring依赖项

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>3.1.0.RELEASE</version>
    </dependency>
...
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.1.0.RELEASE</version>
    </dependency>
</dependencies>

修改

嗯, NoSuchMethodError 告诉我们的是您的应用程序正在执行 StandardServletEnvironment 认为 JndiLocatorDelegate 有一个名为 isDefaultJndiEnvironmentAvailable()的方法,但实际调用它时该方法不存在。但是这个方法存在于 org.springframewor.context-3.1.1.jar 中,你可以看到here (version 3.1.0)

所以,问题可能是几件事:

  • 类路径中有多个 JndiLocatorDelegate 。如果您使用其他库metrics.collector,则可以执行此操作。在Eclipse中,您可以按Ctrl + Shift + T并键入 JndiLocatorDelegate ,以确保在项目中只找到一个名为this的类,并查看该类是否包含 isDefaultJndiEnvironmentAvailable() 方法。

  • 由于某些奇怪的原因,您没有执行当前的代码。尝试清理项目,临时文件夹和Tomcat工作目录。

如果这对您没有帮助,请向我们提供战争中包含的所有罐子的列表。

答案 1 :(得分:1)

为了查看导致此错误的原因(可能是GAE或Spring问题)

尝试使用与GAE 100%兼容的Spring版本,请在列表中查看

WillItPlayInJava

并选择与GAE合作的Spring版本 因为也许你试图使用的版本目前不适用于GAE(没有特殊的调整)

另外,请看一下:Can i use Spring on GAE?了解更多信息..,

答案 2 :(得分:0)

在你的html标签上:

<img src="/images/ajax-loader.gif"/>

我错过了webapps上绝对路径所需的Web应用程序上下文(除非它被配置为根应用程序)。

使用contextPath“/ foo”(如在http://host:post/foo中):

<img src="/foo/images/ajax-loader.gif"/>

答案 3 :(得分:0)

尝试:

<static-files> <include path="/images/*.*" /> </static-files>

正则表达式中的双星号应该是一个闭包,它会杀死正则表达式或让它永远运行。

答案 4 :(得分:0)

由于HTML是单独提供的(通过调用servlet),因此请尝试通过直接追踪图像(使用图像的URL)将其删除。然后在日志中显示什么?

对我来说唯一可疑的是include元素。

<include path="images/*.gif" />

形式,之前遇到过一些奇怪的“**”处理。