ehcache 在 Tomcat Docker 映像中不起作用

Posted

技术标签:

【中文标题】ehcache 在 Tomcat Docker 映像中不起作用【英文标题】:ehcache not working in Tomcat Docker image 【发布时间】:2017-06-27 20:55:36 【问题描述】:

我已经获得了一个用于容器化的 Java 应用程序。

应用程序当前在 Tomcat8 JRE8 AWS Elasticbeanstalk 实例上运行。

但是,该应用程序无法在我的 Docker 映像中部署,该映像是从 Amazon Linux 基础映像构建的,并通过 RPM 安装了 OpenJDK8 和 Tomcat8。

部署错误与 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 版本不可用,就会出现这个错误。

我已签入应用程序有效负载,并且正确的 jar 可用:

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 映像中是如何实现的。我认为这是一个虚假错误,它是由运行时与 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 在历史进程中改变了 jar 的名称。您的冲突来自于您的类路径中同时包含 ehcache-core-2.4.5.jarehcache-2.10.2.jar

很可能第一个是第一个被拾取的,因此您会收到此无效属性错误。您很可能必须删除ehcache-core-2.4.5.jar,但这可能需要增加其他依赖项,尽管 Ehcache 始终试图保持跨 2.x 行的向后兼容性。

【讨论】:

答案是正确的。作为旁注,如果我是你,我会将 updateCheck 设置为 false。 有道理,但我很好奇为什么这不是 ElasticBeanstalk 实例中的问题,而是 Docker 容器中的问题。

以上是关于ehcache 在 Tomcat Docker 映像中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Ehcache缓存框架与 Shiro 框架 出现出现验证错误 && Tomcat 缓存清除的问题

由于设备映射器错误,无法运行 Docker 容器

docker-storage-setup 软件包在我的 rhel 7 盒子上不可用?我怎么得到它?我需要使用设备映射器创建一个精简池。

java web开发缓存方案,ehcache和redis哪个更好

mybatis配置好了MapperScannerConfigurer 注入了映射器 为啥启动Tomcat 就报错 一定要我写dao的Impl

hibernate二级缓存配置,系统提示找不到ehcache.xml的配置文件