【问题标题】:java.lang.NoClassDefFoundError: net/sf/ehcache/concurrent/ReadWriteLockSyncjava.lang.NoClassDefFoundError: net/sf/ehcache/concurrent/ReadWriteLockSync
【发布时间】:2018-09-27 04:19:59
【问题描述】:

我有一个使用 java8 运行的 SpringBoot 应用程序。它运行良好,但有时会开始抛出以下错误。

java.lang.NoClassDefFoundError: net/sf/ehcache/concurrent/ReadWriteLockSync
at net.sf.ehcache.store.MemoryStore$LockProvider.getSyncForKey(MemoryStore.java:1038)
at net.sf.ehcache.Cache.tryRemoveImmediately(Cache.java:2170)
at net.sf.ehcache.Cache.get(Cache.java:1756)
at org.springframework.cache.ehcache.EhCacheCache.lookup(EhCacheCache.java:142)
at org.springframework.cache.ehcache.EhCacheCache.get(EhCacheCache.java:67)
at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:73)
at org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:527)
at org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:492)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:374)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:316)
at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)

任何帮助将不胜感激。

【问题讨论】:

  • 您对我的解决方案有意见吗?

标签: java spring-boot spring-data-jpa spring-cache


【解决方案1】:

EhCache 在版本 2 和 3 之间更改了包名称。

net.sf.ehcache 指的是 EhCache2 中的包(您的应用程序正在尝试查找此版本)

org.ehcache 指的是新的 EhCache3

可能是您的代码使用 EhCache2,但现在失去了依赖关系。例如,如果您尝试将 Spring Boot 1.5 更新为 Spring Boot 2,则会发生这种情况

要进行进一步测试,请尝试在您的 pom.xml 中强制 EhCache2 具有以下依赖项:

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.5</version>
    </dependency>

【讨论】:

    【解决方案2】:

    NoClassDefFoundError 在编译时类可用并且程序已成功编译和链接但类在运行时丢失时发生。

    可能的解决方案:

    这里您使用的是EhCache,因此您可能对此有一些依赖性。将 EhCache jar 从存储库复制到您的项目文件夹(可能是您可以添加到 build pathlib 文件夹)。现在您明确地给出了jar 文件,因此您可以评论相应的依赖项或提供其范围。

    现在您可以尝试查看是否再次收到错误消息。 :)

    【讨论】:

    • 感谢您的回复。但正如所述应用程序成功运行,但说几个小时/天甚至几个月后它开始抛出这个错误。我的所有代码(包括依赖项)都存在于单个 jar 文件中。
    • 所以问题是:即使您不重新运行应用程序,它也会引发错误。运行后,可以完美运行一段时间,然后报错。是吗?
    • 它突然开始抛出错误,如果我重新启动错误就会消失。所以不知道这背后的原因是什么。
    • 有可能只有在某些情况下您的代码才使用该特定类,并且当这种情况发生时,您会收到异常。所以你可以用这种方式调试。尝试查找导致此问题的代码,然后尝试查找(不是根据时间,而是根据测试用例)执行该代码的时间。因此,如果结果是肯定的,则缺少 jar(或至少是类)。还要确保您使用的是最合适的 jar 版本。
    • 感谢您的建议。错误在于 Ehcache,它不是一个孤立的代码,每个请求都很少通过它调用。我正在研究它并将分享我的发现
    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2016-08-19
    • 2014-01-26
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多