Grails 2.4 ClassNotFoundException:Sitemesh GrailsPageFilter

时间:2015-03-05 20:29:09

标签: grails classnotfoundexception sitemesh

请注意:这个问题几乎this one titled "resource plugin error when upgrading from grails 2.3.8 2.4"重复,但有些事情有所不同,在我看来,值得问一下这是一个单独的问题:

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

所以,我要求你在关闭/关闭投票之前作为一个骗子,请指出我在其他问题中提供的确切解决方案也将适用于我的确切的情况。 如果您不能这样做,请不要关闭/关闭此问题!

我正在将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 个答案:

答案 0 :(得分:5)

我不确定为什么你不能使用Grails 2.4.4中的资源插件,但我的建议是使用asset-pipeline,因为它远远优于较旧的resources插件。这是一篇非常好的文章,解释了为什么(来自插件的作者),以及如何:

修改

再看看,我认为这可能是版本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文件的链接: