не удается получить доступ к net.sf.ehcache.CacheManager, файл класса для net.sf.ehcache.CacheManager не найден

Я реализовал кэширование в своем проекте, используя EhCache. Я добавил следующие зависимости в свой pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.8.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.3.1</version>
</dependency>

Обратите внимание на третью зависимость для EhCache. Во всех учебниках, которые я нашел в Интернете, идентификатор группы отличается. Причина, по которой я изменил идентификатор группы, заключалась в том, что он был перемещен на org.ehcache.

У меня есть следующий файл ehcache.xml в моем пути к классам.

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true"
         monitoring="autodetect"
         dynamicConfig="true">

    <diskStore path="java.io.tmpdir"/>

    <cache name="cardTypes"
           maxEntriesLocalHeap="100"
           maxEntriesLocalDisk="1000"
           eternal="false"
           timeToIdleSeconds="300"
           timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LFU"
           transactionalMode="off">
        <persistence strategy="localTempSwap"/>
    </cache>

</ehcache>

Ниже приведен мой файл конфигурации.

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.core.io.ClassPathResource;

@EnableCaching
@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheCacheManager().getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheCacheManager() {
        EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
        factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
        factory.setShared(true);
        return factory;
    }

}

Теперь я получаю сообщение об ошибке в следующей строке.

return new EhCacheCacheManager(ehCacheCacheManager().getObject());

То есть:

В затмении: -

Тип net.sf.ehcache.CacheManager не может быть разрешен. На него косвенно ссылаются необходимые файлы .class.

В JIdea:

Error:(21, 71) java: cannot access net.sf.ehcache.CacheManager
  class file for net.sf.ehcache.CacheManager not found

Я не добавлял в свой проект ничего из net.sf.ehcache. Как я упоминал ранее, ehcache был перемещен в org.ehcache.

Почему я получаю эту ошибку? Это связано с net.sf.ehcache, который не является частью зависимостей, которые я добавил.

Должен ли я кодировать второй компонент по-другому, так как артефакт был перемещен? или как я могу это решить?


person vigamage    schedule 03.06.2017    source источник


Ответы (2)


Ehcache 2 находится в пакете net.sf.ehcache. Большинство учебников посвящено этому, поскольку у него была долгая и полезная жизнь. Ehcache 3, версия, которую вы настроили, довольно новая (но, конечно, лучше) и в пакете org.ehcache.

Пакет переехал, потому что иметь собственный домен было приятнее, а также потому, что новая версия сильно отличается, и может потребоваться возможность сосуществовать со старой версией (из-за того, что ее использует какая-то структура).

Ваша ошибка связана с тем, что EhCacheCacheManager использует Ehcache 2. Ehcache 3 не нужен, поскольку он совместим с JCache. Так что вместо этого вы можете использовать JCacheCacheManager.

Итак, прямо сейчас у вас есть проводка Spring и ehcache.xml для Ehcache 2. И зависимость от Ehcache 3. Вы должны выровнять их, чтобы решить вашу проблему.

Чтобы использовать Ehcache 3, проще всего добавить его в свой application.properties

spring.cache.jcache.config=ehcache.xml

И это:

@EnableCaching
@Configuration
public class CacheConfig {
}

Вот и все.

person Henri    schedule 04.06.2017
comment
Большое спасибо. Попробовав несколько вещей, решение, которое я придумал, заключалось в использовании старого Ehcache 2. Это решило проблему. Однако это тоже решение. Я принимаю это. :) - person vigamage; 04.06.2017
comment
спасибо ;-) Как я уже сказал, перенос зависимости на ehcache 2, конечно, тоже работает :-) - person Henri; 05.06.2017
comment
Спасибо! Я нашел пример кода с ehcache 2, который работает: github.com/TechPrimers/spring-ehcache-example/blob/master/src/ - person Aliya; 15.11.2018

Добавьте следующую зависимость в файл pom:

<dependency>
     <groupId>net.sf.ehcache</groupId>
     <artifactId>ehcache</artifactId> 
     <version>2.10.4</version>
</dependency>
person jayD    schedule 21.03.2018