2017-02-09 31 views
0

Мне предоставлено приложение Java для контейнеризации.ehcache не работает в Tomcat Docker image

Приложение в настоящее время работает на экземпляре Tomcat8 JRE8 AWS Elasticbeanstalk.

Однако приложение не удается развернуть в моем изображении Docker, которое построено из базового образа Amazon Linux с OpenJDK8 и Tomcat8, установленным через RPM.

Ошибка развертывания относится к Ehcache:

Error creating bean with name 'getEhcache' defined in *****: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Error configuring from input stream. Initial cause was null:16: Element <cache> does not allow attribute "maxEntriesLocalHeap". 

Я понимаю, что эта ошибка обычно возникает, когда существует несоответствие конфигурации между Ehcache и версией Ehcache используется, а именно, что maxEntriesLocalHeap была введена в версии 2.10, и если версия 2.10 недоступна, эта ошибка произойдет.

Я проверил в полезной нагрузке приложения, и правильная баночка имеется:

bash-4.2# pwd 
/var/lib/tomcat8/webapps/ROOT/WEB-INF/lib 
bash-4.2# ls -la ehcache-* 
-rw-rw-r-- 1 root root 8914463 Jan 24 12:27 ehcache-2.10.2.jar 
-rw-rw-r-- 1 root root 1006074 Jan 24 12:27 ehcache-core-2.4.5.jar 
-rw-rw-r-- 1 root root 124522 Jan 24 12:27 ehcache-spring-annotations-1.2.0.jar 

Разработчик сказал мне, что приложение набирает более старую версию Ehcache, но я не могу видеть как это возможно в ванильном изображении Докера. Я думаю, что это ложная ошибка, создаваемая чем-то связанным с разрешениями или доступом к файловой системе в контейнере Docker при запуске.

Файл 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="messageCache" 
     maxEntriesLocalHeap="10000" 
     maxEntriesLocalDisk="1000" 
     eternal="false" 
     diskSpoolBufferSizeMB="20" 
     timeToIdleSeconds="43200" timeToLiveSeconds="43200" 
     memoryStoreEvictionPolicy="LFU" 
     transactionalMode="off"> 
    <persistence strategy="localTempSwap"/> 
</cache> 

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

ответ

1

Ehcache изменил название банки в ходе истории. Ваш конфликт возникает из-за наличия как ehcache-core-2.4.5.jar, так и ehcache-2.10.2.jar на вашем пути к классам.

Скорее всего, первый из них подбирается первым, и, таким образом, вы получаете эту неверную ошибку атрибута. Скорее всего, вам придется удалить ehcache-core-2.4.5.jar, но для этого может потребоваться наложение других зависимостей, хотя Ehcache всегда старался сохранить обратную совместимость по линии 2.x.

+0

Ответ правильный. Как побочная заметка, я бы превратил 'updateCheck' в false, если бы я был вами. – Henri

+0

Имеет смысл, но мне любопытно, почему это не проблема в экземпляре ElasticBeanstalk, но проблема в контейнере Docker. –