2015-03-03 1 views
0

У меня есть класс Java, который имеет статическую реализацию, которая извлекает конфигурацию кэша и его экземпляр, как показано ниже:NoClassDefFoundError с новой Ehcache конфигурации

import net.sf.ehcache.Cache; 
import net.sf.ehcache.CacheManager; 
import net.sf.ehcache.Element; 
import org.apache.log4j.Logger; 

import java.net.URL; 

public final class MyCacheImplementation { 

    private MyCacheImplementation() { 
     super(); 
    } 

    private static Cache myCache; 

    private static final String EHCACHFILENAME = "....... ehcache.xml"; 

    static { 
     try { 
      final URL url = MyCacheImplementation.class.getClassLoader().getResource(EHCACHFILENAME); 
      final CacheManager cacheManager = new CacheManager(url); 
      myCache = cacheManager.getCache("myCacheName); 
     } catch (final Exception e) { 
      throw new RuntimeException("Error initializing Ehcache", e); 
     } 
    } 

    public static void addItemToCache(final Object obj) {  
     myCache.put(new Element("obj1234", obj));  
    } 

    public static Cache getMyCache() { 
     return myCache; 
    } 

} 

Я тогда есть класс, что ссылка выше класс статически и запрашивает кэш, как показано ниже:

final MyCacheImplementation cacheReference = MyCacheImplementation.getMyCache(); 

Моя конфигурация кэша выглядит следующим образом:

<ehcache> 
    <defaultCache maxElementsInMemory="10000" eternal="false" 
     timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" 
     diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /> 

    <cache name="myCacheName" maxElementsInMemory="1000" 
     eternal="false" overflowToDisk="false" timeToIdleSeconds="18000" 
     diskPersistent="false" 
     timeToLiveSeconds="18000" /> 
</ehcache> 

Все работает так, как ожидалось, и я могу получить доступ к кешу таким образом.

Затем мы обновили наш Ehcache версии 2.9 и выключила дисковые магазины ака изменения выше конфигурации выглядеть следующим образом:

<ehcache> 
    <defaultCache maxElementsInMemory="10000" timeToIdleSeconds="120" timeToLiveSeconds="120"> 
     <persistence strategy="none" /> 
    </defaultCache> 

    <cache name="myCacheName" maxElementsInMemory="1000" timeToIdleSeconds="18000" timeToLiveSeconds="18000"> 
     <persistence strategy="none" /> 
    </cache> 
</ehcache> 

Теперь, если я бегу то же самое, что и выше я получаю java.lang. NoClassDefFoundError: Не удалось инициализировать ошибку класса NoClassDefinition. Если я откажу конфигурацию EHCache до того, что она работает, она отлично работает. Любая идея, что может быть неправильно с этим конфигом? У меня есть серверные другие места в нашем коде, где конфигурация точно такая же и что не вызывает никаких проблем?

+0

Можете ли вы опубликовать трассировку стека ошибки, которую вы получаете? –

ответ

0

Оказывается, что фактическое исключение было проглочено.

Исключения было, когда кэшированное пытаются инициализируются со следующим сообщением об ошибке:

ehcache Element <defaultCache> does not allow nested <persistence> elements 

Оказывается, что у меня был trasitive зависимости к старой версии Ehcache вытащил в кэшировании Hibernate, как описано по this site