Java.lang.NoClassDefFoundError: net / sf / ehcache / concurrent / ReadWriteLockSync

У меня есть приложение SpringBoot, работающее с java8. Он работает хорошо, но иногда начинает выдавать следующую ошибку.

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)

Любая помощь будет оценена по достоинству.

Есть ли у вас отзывы о моем решении?

ValerioMC 03.10.2018 11:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
687
2

Ответы 2

NoClassDefFoundError возникает, когда класс доступен во время компиляции, и программа была успешно скомпилирована и скомпонована, но класс отсутствует во время выполнения.

Возможное решение:

Здесь вы используете EhCache, поэтому для этого у вас может быть зависимость. Скопируйте этот EhCachejar из репозитория в папку вашего проекта (это может быть папка lib, которую вы можете добавить в build path). Теперь вы явно предоставляете файл jar, чтобы вы могли либо прокомментировать соответствующую зависимость, либо указать ее область действия.

Теперь вы можете попробовать и посмотреть, появится ли ошибка снова. :)

Спасибо за ваш ответ. Но, как указано, приложение работает успешно, но, скажем, через несколько часов в день или даже через несколько месяцев оно начинает выдавать эту ошибку. И весь мой код, включая зависимости, существует в одном файле jar.

Munish Dhiman 27.09.2018 07:24

так что проблема в том, что он выдает ошибку, даже если вы не запускаете приложение повторно. После его запуска некоторое время работает отлично, а затем выдает ошибку. это?

R Dhaval 27.09.2018 07:55

Он внезапно начинает выдавать ошибку, и если я перезапускаю, ошибка исчезает. Так что не знаю, в чем причина этого.

Munish Dhiman 27.09.2018 07:56

Существует вероятность, что только в некотором сценарии ваш код использует этот конкретный класс, и когда этот сценарий произойдет, вы получите исключение. Таким образом, вы можете отлаживать таким образом. Попытайтесь найти, какой код вызывает это, а затем попытайтесь найти, когда (не с точки зрения времени, а с точки зрения тестового примера) этот код выполняется. Итак, если результат положительный, значит jar (или, по крайней мере, class) отсутствует. также убедитесь, что вы используете наиболее подходящую версию банки.

R Dhaval 27.09.2018 08:57

Спасибо за ваше предложение. Ошибка связана с Ehcache, и это не изолированный код, который вызывается редко, каждый запрос проходит через него. Я изучаю это и поделюсь своими выводами

Munish Dhiman 27.09.2018 09:11

EhCache изменил имя пакета с версии 2 на 3.

net.sf.ehcache относится к пакету в EhCache2 (ваше приложение пытается найти эту версию)

org.ehcache относится к новому EhCache3

Возможно, у вас есть код, работающий с EhCache2, и теперь он потерял зависимость. Это происходит, например, если вы пытаетесь обновить Spring Boot 1.5 до Spring Boot 2

Чтобы провести дальнейший тест, попробуйте принудительно запустить EhCache2 в вашем pom.xml со следующей зависимостью:

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

Другие вопросы по теме