Java.lang.ClassNotFoundException: net.spy.memcached.compat.log.SLF4JLogger
Я добавил в Java opts -Dnet.spy.log.LoggerImpl = net.spy.memcached.compat.log.SLF4JLogger
для установки spymemcached для использования slf4j в качестве регистратора. Но я получаю следующее WARNING в журналах tomcat6, и я озадачен ошибкой
net.spy.memcached.compat.log.SLF4JLogger not found while initializing net.spy.compat.log.LoggerFactory java.lang.ClassNotFoundException: net.spy.memcached.compat.log.SLF4JLogger
Как возможно, что класс SLF4JLogger не найден. То, что он инициализировал LoggerFactory, подразумевает, что пакет net.spy был доступен, и, как правило, была доступна баня memcache spy. Итак, как он мог не найти другой класс.
log4j: setFile ended log4j: Adding appender named [SecurityAuditAppender] to category [SecurityAuditLogger]. Warning: net.spy.memcached.compat.log.SLF4JLogger not found while initializing net.spy.compat.log.LoggerFactory java.lang.ClassNotFoundException: net.spy.memcached.compat.log.SLF4JLogger
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at net.spy.memcached.compat.log.LoggerFactory.getConstructor(LoggerFactory.java:131)
at net.spy.memcached.compat.log.LoggerFactory.getNewInstance(LoggerFactory.java:115)
at net.spy.memcached.compat.log.LoggerFactory.internalGetLogger(LoggerFactory.java:98)
at net.spy.memcached.compat.log.LoggerFactory.getLogger(LoggerFactory.java:87)
at net.spy.memcached.compat.log.LoggerFactory.getLogger(LoggerFactory.java:73)
at net.spy.memcached.compat.SpyThread.getLogger(SpyThread.java:60)
at net.spy.memcached.MemcachedConnection.createConnections(MemcachedConnection.java:152)
at net.spy.memcached.MemcachedConnection.<init>(MemcachedConnection.java:128)
at net.spy.memcached.DefaultConnectionFactory.createConnection(DefaultConnectionFactory.java:176)
at net.spy.memcached.MemcachedClient.<init>(MemcachedClient.java:193)
at net.spy.memcached.spring.MemcachedClientFactoryBean.getObject(MemcachedClientFactoryBean.java:72)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4210)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4709)
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:583)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
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:822)
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:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Ответы
Ответ 1
Если WebAppClassLoader
выбрасывает ClassNotFoundException
, то этот класс не находится в вашем веб-приложении. Получите последнюю версию клиентского баннера spymemcached
(2.12.1 на момент написания этой статьи) и поместите его в каталог WEB-INF/lib
вашего веб-приложения. Удалите из этого каталога все другие теги spymemcached
, чтобы избежать конфликтов с загрузкой.
net.spy.memcached.compat.log.SLF4JLogger
не был введен до версии 2.9.0, поэтому, если вы используете более старую версию net.spy:spymemcached
, это объясните, почему он мог найти LoggerFactory
, но не SLF4JLogger
.
Ответ 2
Вы можете проверить дерево зависимостей Плагин зависимостей
mvn dependency:tree -Dverbose -Dincludes=spymemcached
если вы видите какую-либо другую версию рядом с 2.12.1, проверьте ее верхнюю ссылку и добавьте тег exclude в элемент зависимостей maven, например:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.0.3.RELEASE</version>
<exclusions>
<exclusion>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
</exclusion>
</exclusions>
</dependency