2

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

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

'appname' 状态未确定,没有足够的可用信息。

tomcat Catalina 日志显示下面的 NoClassDefFoundError。

我已经阅读了有关Ivy 缓存的问题,但尚未对此进行研究。我已将 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
4

5 回答 5

3

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

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

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

于 2012-10-08T18:32:11.037 回答
2

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

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()检查可能不是必需的。)

这目前有效,但获得真正的解决方案而不是解决方法会很好。

于 2012-11-19T18:07:50.293 回答
2

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

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

于 2012-08-26T18:24:21.270 回答
1

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

于 2012-08-25T22:05:04.303 回答
1

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

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

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

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

于 2014-05-14T07:45:15.123 回答