appengine-api-1.0-sdk-1.9.57.jar与cache-api-1.0.0.jar之间的冲突

时间:2017-10-05 09:55:47

标签: java google-app-engine tomcat google-api

这个问题开始很奇怪: 我在我的应用程序中使用了org.jsr107.ri库。

当我启动我的应用程序时,使用gradle,一切都很好,但是当我构建一个war文件并将其部署在我的tomcat服务器上时,我得到了例外:

java.util.ServiceConfigurationError: javax.cache.spi.CachingProvider: Provider org.jsr107.ri.spi.RICachingProvider could not be instantiated ... Caused by: java.lang.IncompatibleClassChangeError: Implementing class

经过一番调查,我发现,我在cache-api-1.0.0.jar库中有一个接口javax.cache.CacheManager,在appengine-api-1.0-sdk-中有一个类javax.cache.CacheManager- 1.9.57.jar图书馆。

当我从这个库中删除了javax.cache。*(甚至将appengine-api-1.0-sdk-1.9.57.jar重命名为zappengine-api-1.0-sdk-1.9.57.jar来改变顺序加载类),我的应用程序开始工作正常,但这个解决方案看起来很糟糕(对我而言)。

我打开了一个JSR107规范(http://download.oracle.com/otn-pub/jcp/jcache-1_0-fr-spec/JSR107FinalSpecification.pdf),发现应该使用CacheManager 接口

这个问题有一个很好的解决方案吗? 是否有没有javax.cache(以及可能是javax.mail)库的appengine-api-1.0-sdk-1.9.57.jar文件?

2 个答案:

答案 0 :(得分:0)

一年前也发生在我身上。问题是GAE不符合JCache。它支持JCache的拟议草案版本,但不支持最终版本。谷歌依据标准不改变和实施草案。不幸的是,GAE粉丝的整个Java社区对GAE的JCache实际上对我们没用。

答案 1 :(得分:0)

在appengine-web.xml中添加以下标记

<class-loader-config>
  <priority-specifier filename="cache-api-1.1.1.jar"/>
</class-loader-config>

我遇到了同样的问题,并且得到了上述解决。 有关参考,请查看GCP页面。 https://cloud.google.com/appengine/docs/standard/java/runtime