带有新EHCache配置的NoClassDefFoundError

时间:2015-03-03 14:26:01

标签: java caching ehcache noclassdeffounderror

我有一个Java类,它有一个静态实现,可以获取缓存配置并实例化它,如下所示:

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配置回滚到原来的状态,那就完美了。知道这个配置有什么问题吗?我的代码中还有其他几个地方,配置完全相同,并没有引起任何问题?

1 个答案:

答案 0 :(得分:0)

原来是吞下了实际的异常。

异常是在尝试使用以下错误消息初始化缓存时:

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

事实证明,我对Hibernate缓存引入的旧版EHCache有依赖性,如this site所述