Grails 2.4 ClassNotFoundException:Sitemesh GrailsPageFilter

Posted

技术标签:

【中文标题】Grails 2.4 ClassNotFoundException:Sitemesh GrailsPageFilter【英文标题】:Grails 2.4 ClassNotFoundException: Sitemesh GrailsPageFilter 【发布时间】:2015-05-07 08:51:50 【问题描述】:

请注意:这个问题几乎与this one titled "resource plugin error when upgrading from grails 2.3.8 2.4" 重复,但在我看来,有一些不同之处,值得将其作为一个单独的问题:

在那个问题中,问题和任何答案都没有解释为什么会发生此错误,只是说明正在使用的插件不再是用于加载 sitemesh 的官方 Grails 插件 最重要的是:在那个问题中,从来没有一个可接受的答案或来自原始发布者的任何关于最终解决方案的验证。我不会那样做的。

所以,我要求在您将此作为一个骗子否决/closevote 之前,请向我指出在其他问题中提供了确切 解决方案的位置,该解决方案也将适用于我的确切的情况。 如果你做不到,请不要拒绝/关闭这个问题!

我正在将 Grails 2.3.6 应用程序升级到 Grails 2.4.4。当我执行run-app 时,我得到:

Error |
2015-03-05 14:42:44,257 [localhost-startStop-1] ERROR [localhost].[/myapp]  - Exception starting filter sitemesh
java.lang.ClassNotFoundException: org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter
    at org.grails.plugins.tomcat.ParentDelegatingClassLoader.findClass(ParentDelegatingClassLoader.java:59)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4809)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5485)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Error |
2015-03-05 14:42:44,268 [localhost-startStop-1] ERROR core.StandardContext  - Error filterStart
Error |
2015-03-05 14:42:44,270 [localhost-startStop-1] ERROR core.StandardContext  - Context [/myapp] startup failed due to previous errors

这是我的BuildConfig 的插件部分:

plugins 
    runtime ":resources:1.2.14"
    compile 'org.grails.plugins:gson:1.1.4'
    compile ":standalone:1.3"
    build ":release:3.0.1"
    runtime ":cached-resources:1.0"
    compile ":cache-headers:1.1.7"
    compile ":yammer-metrics:3.0.1-2"
    compile ":scaffolding:2.1.2"
    compile ':cache:1.1.1'
    runtime ":hibernate:3.6.10.8" // or ":hibernate4:4.3.1.1"
    runtime ":database-migration:1.3.8"
    runtime ":jquery:1.11.1"
    test(":geb:$gebVersion")
    test(":spock:0.7") 
        exclude "spock-grails-support"
    

如果可以避免的话,我确实想使用asset-pipeline。到目前为止,我阅读的所有内容都表明使用 resources:1.2.14 可以使 Grails 2.4.4 应用程序与资源插件兼容。

有人可以解释 Grails 2.4.4 使用 sitemesh 的方式,以便这个错误消失吗?如果使用asset-pipeline 是不可避免的,我需要对我的项目进行哪些确切的转换才能使用它。我确实尝试用最新的资产管道插件替换资源插件,如下所示:

plugins 
    ...
    //runtime ":resources:1.2.14"
    compile ":asset-pipeline:1.8.3"
    ...

但错误并没有消失。想法?

【问题讨论】:

【参考方案1】:

我不确定你为什么不能在 Grails 2.4.4 中使用资源插件,但我的建议是使用 asset-pipeline,因为它比旧的 resources 插件要好得多.这是一篇很好的文章,解释了原因(来自插件的作者),以及如何:

Why asset pipeline over Grails resources plugin?

编辑

再看一遍,我认为这可能是与 2.3.x 版本不兼容的 web.xml 的问题。其中有以下内容:

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class>
</filter>

这是新的 2.4.x web.xml 文件的链接:

https://gist.github.com/caseyscarborough/03b06f1cd7c2ff331c5a

【讨论】:

Grails 4.X 的解决方案是什么?因为 Grails 4.x.x 没有 web.xml 文件.. @blacktide【参考方案2】:

如果您使用的是 Grails 4.x,请查看您的 sitemesh.xml 文件。

在我的情况下,Grails 升级后该文件是 uneccessary,所以我删除了 src/main/webapp/WEB-INF/sitemesh.xml 以使用默认值。您显然希望保留此文件的备份,直到您知道是否可以用与您的项目相同的方式解决问题。

【讨论】:

以上是关于Grails 2.4 ClassNotFoundException:Sitemesh GrailsPageFilter的主要内容,如果未能解决你的问题,请参考以下文章

Grails从1.3升级到2.4

如何在 Grails 2.4 中外部化 Maven 凭证

带有俄语语言的 Grails 2.4 中的 UTF-8 问题

JSON的Grails 2.4命名配置不起作用

运行应用程序的 Grails 2.4 和 hibernate4 错误

Grails 2.2.4:瞬态属性:为啥自定义验证器被调用两次?