2015-02-04 103 views
2

我想部署一个Grails应用程序到Tomcat 8.0.15。如果有问题,操作系统是CentOS 7,Java版本是1.7.0_71,memcached版本是1.4.20。Memcached和Tomcat 8不兼容

我使用Grails Standalone Tomcat plugin来使用memcached作为会话管理器,它在Tomcat 7中运行良好。不幸的是,迁移到Tomcat 8并不像预期那么简单。

我发现这个公司的依赖关系中:de.javakaffee.msm:memcached-session-manager-tc7:1.6.4,所以我试图将其更改为tc8(存在于Maven)和更新各种其他插件的版本。

不幸的是,我碰到一个问题就来了,同时部署在Tomcat 8应用:

04-Feb-2015 16:26:08.371 INFO [http-nio-8080-exec-17] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/tomcat/webapps/ROOT.war 
2015-02-04 16:26:18 ERROR [GrailsContextLoaderListener] Error initializing the application: loader constraint violation: when resolving overridden method "de.javakaffee.web.msm.MemcachedBackupSessionManager.changeSessionId(Lorg/apache/catalina/Session;)V" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, de/javakaffee/web/msm/MemcachedBackupSessionManager, and its superclass loader (instance of java/net/URLClassLoader), have different Class objects for the type ger.changeSessionId(Lorg/apache/catalina/Session;)V used in the signature 
java.lang.LinkageError: loader constraint violation: when resolving overridden method "de.javakaffee.web.msm.MemcachedBackupSessionManager.changeSessionId(Lorg/apache/catalina/Session;)V" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, de/javakaffee/web/msm/MemcachedBackupSessionManager, and its superclass loader (instance of java/net/URLClassLoader), have different Class objects for the type ger.changeSessionId(Lorg/apache/catalina/Session;)V used in the signature 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) 
    at java.lang.Class.getDeclaredMethods(Class.java:1860) 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

总之,有一个叫changeSessionId方法,它是由类de.javakaffee.web.msm.MemcachedBackupSessionManager覆盖,但是它有一些不同于什么类加载器期待。

我在Google上找不到任何帮助,并尝试更改很多版本和依赖项,结果无济于事,所以我决定回滚到Tomcat 7.但是我想在此留下此情况,以免有人找到解决方案。

回答

0

Grails的插件使用tomcat7 memcached的会话管理器的罐子

https://github.com/burtbeckwith/grails-standalone-tomcat-memcached/blob/master/grails-app/conf/BuildConfig.groovy#L25

按Memcache的会话管理器,每个的tomcat 6的文档,7 & 8有自己的jar https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

+0

是的,我知道。我在问题中说过,我尝试将插件的依赖项更改为Tomcat8的jar,但它没有工作:( – mathifonseca