У меня есть приложение 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)
Любая помощь будет оценена по достоинству.




NoClassDefFoundError возникает, когда класс доступен во время компиляции, и программа была успешно скомпилирована и скомпонована, но класс отсутствует во время выполнения.
Возможное решение:
Здесь вы используете EhCache, поэтому для этого у вас может быть зависимость. Скопируйте этот EhCachejar из репозитория в папку вашего проекта (это может быть папка lib, которую вы можете добавить в build path). Теперь вы явно предоставляете файл jar, чтобы вы могли либо прокомментировать соответствующую зависимость, либо указать ее область действия.
Теперь вы можете попробовать и посмотреть, появится ли ошибка снова. :)
Спасибо за ваш ответ. Но, как указано, приложение работает успешно, но, скажем, через несколько часов в день или даже через несколько месяцев оно начинает выдавать эту ошибку. И весь мой код, включая зависимости, существует в одном файле jar.
так что проблема в том, что он выдает ошибку, даже если вы не запускаете приложение повторно. После его запуска некоторое время работает отлично, а затем выдает ошибку. это?
Он внезапно начинает выдавать ошибку, и если я перезапускаю, ошибка исчезает. Так что не знаю, в чем причина этого.
Существует вероятность, что только в некотором сценарии ваш код использует этот конкретный класс, и когда этот сценарий произойдет, вы получите исключение. Таким образом, вы можете отлаживать таким образом. Попытайтесь найти, какой код вызывает это, а затем попытайтесь найти, когда (не с точки зрения времени, а с точки зрения тестового примера) этот код выполняется. Итак, если результат положительный, значит jar (или, по крайней мере, class) отсутствует. также убедитесь, что вы используете наиболее подходящую версию банки.
Спасибо за ваше предложение. Ошибка связана с Ehcache, и это не изолированный код, который вызывается редко, каждый запрос проходит через него. Я изучаю это и поделюсь своими выводами
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>
Есть ли у вас отзывы о моем решении?