Зависимости Tomcat Memcached в комплекте с WAR - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время я использую memcached-tomcat-session-manager с Tomcat7 для хранения сеансов.

Это настраивается в установленном порядке с различными JAR-файлами memcached / transcoder / serializer в $CATALINA_HOME/lib и $CATALINA_HOME/conf/context.xml с записью <Manager> ... и работает просто отлично.

Ситуация имеетвозникла, где я хотел бы поделиться некоторыми static свойствами классов между моим веб-приложением и (моей измененной версией) memcached-session-manager.Я считаю, что с текущей настройкой они находятся в отдельных загрузчиках классов, поэтому совместное использование статических ресурсов между классами невозможно.

Это побудило меня связать все зависимости с /WEB_INF/lib и переместить определение <Manager ... в /META-INF/context.xml.Это не работает, с отчетом Tomcat:

portal_1     | 2018-12-21 01:26:27,291 [Portal] SEVERE {localhost-startStop-1}   Digester Begin event threw exception                                                                                               
portal_1     | java.lang.ClassNotFoundException: de.javakaffee.web.msm.MemcachedBackupSessionManager                                                                                                                
portal_1     |  at java.net.URLClassLoader.findClass(URLClassLoader.java:381)                                                                                                                                       
portal_1     |  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)                                                                                                                                            
portal_1     |  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)                                                                                                                                            
portal_1     |  at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:144)                                                                                                                
portal_1     |  at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1303)                                                                                                                        
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)                                                                                            
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)                                                                            
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1339)                                                                
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)                                                      
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)                                                                                             
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)                                                                     
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)                                                                                                 
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)                                                                                                 
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)                                                                                                                   
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)                                                                                                  
portal_1     |  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)                                                                                                
portal_1     |  at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1576)                                                                                                                               
portal_1     |  at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:644)                                                                                                           
portal_1     |  at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:606)                                                                                                                  
portal_1     |  at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:842)                                                                                                                           
portal_1     |  at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:399)                                                                                                                 
portal_1     |  at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)                                                                                                          
portal_1     |  at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)                                                                                                                 
portal_1     |  at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:388)                                                                                                                  
portal_1     |  at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:103)                                                                                                                              
portal_1     |  at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:135)
portal_1     |  at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
portal_1     |  at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
portal_1     |  at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
portal_1     |  at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
portal_1     |  at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2021)
portal_1     |  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
portal_1     |  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
portal_1     |  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
portal_1     |  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
portal_1     |  at java.lang.Thread.run(Thread.java:748)

Я уверен, что зависимости связаны в WAR.После прочтения документации Tomcat 7 мне не ясно, возможно ли то, что я делаю, - наличие классов, определенных в WAR context.xml, которых нет в $CATALINA_HOME/lib, например, загрузчик классов приложений еще не был создан.

1 Ответ

0 голосов
/ 02 января 2019
Банки

memcached-session-manager (msm) должны находиться в $CATALINA_HOME/lib, поскольку они используют внутренние классы tomcat (что невозможно изнутри веб-приложения).Конкретнее, это jar memcached-session-manager.jar, memcached-session-manager-tc7.jar и spymemcached.jar.

. Единственными jsr-связанными jar-файлами, которые необходимо поместить в /WEB_INF/lib, являются jar-файлы, связанные с сериализацией, такие как msm-kryo-serializer (обычно определяется какзависимости в вашей сборке maven / gradle / xyz), поскольку они должны иметь доступ к классам приложений.

См. также связанную документацию msm .

Относительно вашей целидля обмена информацией между msm и вашим приложением: поскольку jar-файлы msm должны находиться в $CATALINA_HOME/lib, концептуально невозможно статически связать код приложения с кодом msm (кроме кода, связанного с сериализатором msm).Это возможно только с дополнительным косвенным указанием: определением некоторого интерфейса внутри msm, где приложение обеспечивает реализацию и который затем загружает msm посредством отражения.Вот как сериализаторы подключаются к msm, см. интерфейс TranscoderFactory (загружен из $CATALINA_HOME/lib) и реализацию KryoTranscoderFactory (загружен из /WEB_INF/lib).

...