【问题标题】:"state is undetermined" when starting Grails app on CloudFoundry在 CloudFoundry 上启动 Grails 应用程序时出现“状态未确定”
【发布时间】:2012-08-25 21:11:48
【问题描述】:

我有一个 Grails 应用程序已经在 CloudFoundry 上运行了几个月。我将应用程序从 Grails 2.0.4 更新到 2.1.0,还更新了一些我一直在使用的插件。

现在,当我将应用推送到 CloudFoundry 并启动时,我收到错误:

“appname”状态未确定,可用信息不足。

tomcat Catalina 日志显示下面的 NoClassDefFoundError。

我已阅读有关 Ivy cache 的问题,但尚未对此进行调查。我已将 vmc 更新到最新版本 (0.3.18)。

SEVERE: Error deploying web application directory ROOT
java.lang.NoClassDefFoundError: org/apache/tomcat/PeriodicEventListener
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1128)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1026)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4421)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4734)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
    at org.apache.catalina.core.StandardService.start(StandardService.java:525)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.PeriodicEventListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    ... 34 more

【问题讨论】:

    标签: grails cloud-foundry


    【解决方案1】:

    我刚从 Grails 1.3.7 迁移到 2.1.1 时遇到了这个问题。

    我通过解压 WAR 文件、删除所有 tomcat-*.jar 文件(有几个 tomcat 嵌入的 jars)然后重新启动 Tomcat 来修复它。

    我正在运行 Tomcat 6,我想知道这是否是问题所在?无论如何,我的应用程序现在可以运行——尽管它不是最好的安装过程!

    【讨论】:

      【解决方案2】:

      我通过从 2.1.0 回滚到 Grails 2.0.4 解决了这个问题。我认为问题可能出在described here 上。但 Graeme 提供的解决方法并没有解决部署到 cloudfoundry.com 时的问题。

      在 Grails 2.1.0 下本地运行此应用程序没有问题,但在 cloudfoundry.com 下无法运行。

      【讨论】:

      • 是的,我也不得不回滚到 Grails 2.0.4。必须有另一种方法来解决这个问题!
      【解决方案3】:

      我没有使用 CloudFoundry,但在将 Grails 2.1 WAR 部署到 Tomcat 6 时遇到了同样的问题。目前,我已将 _Events.groovy 配置为从 WAR 暂存区域中删除嵌入的 tomcat-grails-plugin-tomcat- jar在 WAR 生成之前:

      eventCreateWarStart = { warName, stagingDir ->
          // Work-around to remove tomcat jars from .war.
          File libDir = new File("${stagingDir}/WEB-INF/lib/")
          if (libDir.exists() && libDir.isDirectory()) {
              ant.echo(message: 'Events.eventCreateWarStart: Removing embedded tomcat .jars from .war.')
              libDir.eachFileMatch(FileType.FILES, ~/^(tomcat|grails-plugin-tomcat).*\.jar$/) { File jarToRemove ->
                  jarToRemove.delete()
              }
          }
      }
      

      libDir.exists() && libDir.isDirectory() 检查可能不是必需的。)

      这目前可行,但最好能找到真正的解决方案而不是解决方法。

      【讨论】:

        【解决方案4】:

        我在使用 Spring 应用时遇到了同样的问题。重新启动服务后 ~cloudfoundry/vcap/dev_setup/bin/vcap stop, cloudfoundry/vcap/dev_setup/bin/vcap start 我设法推送我的应用程序没有任何问题。在更强大的机器上安装 CF 可能会有所帮助。你目前的硬件是什么?

        【讨论】:

        • 我在 cloudfoundry.com 上运行。还没有尝试过我自己的 Micro cloudfoundry。
        • 您能提供您的代码以便在我的 CF 安装中使用它吗?
        • 我的应用程序日志显示了来自引导代码的所有预期消息,然后当它应该从(spring security 生成的)LoginController 中获取消息时什么也没有。
        • 这是另一种方法,它将为我们提供基线。下载并安装 grails 2.0.4,然后从 github.com/SpringSource/cloudfoundry-samples 克隆 cloudfoundry petclinic 应用程序。在本地运行,然后部署到 cf.com(需要您在那里绑定一个 postgres 数据库)。在这里成功,然后升级到 2.1.1(这对我来说是正确的)。我们可以从那里去。或者使用您的应用打开私人票证,我们将在此处发布结果。
        【解决方案5】:

        我知道这个问题是关于 Grails 和 CF 的,但 Google 并不太关心这个问题……;)

        java.lang.ClassNotFoundException: org.apache.tomcat.PeriodicEventListener
        

        也可能在 Eclipse WTP 尝试发布 Maven 项目并运行它时出现。在你的依赖层次结构中的某个地方,你应该找到一个 tomcat 库,即使它的范围是 providedtest

        检查您的 WTP-webapp 的 lib 目录,并注意其中的一堆 tomcat 库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2015-05-11
          • 2019-02-26
          相关资源
          最近更新 更多