私はSpymemcachedライブラリを利用するHeroku Javaアプリを持っています。私の場合、これはhibernate-memcachedライブラリ(1.3)の使用によって含まれています。
アプリへのすべてのリクエストが HTTPS 経由で送信されるようにする必要があります。これにより、この投稿にたどり着きました。ソリューションは、webapp-runner プラグインといくつかの構成を使用してアプリに適切なヘッダーを取得することに重点を置いています (ランナーに context.xml を提供します)。
私の問題は、webapp-runner プラグインが Spymemcached ライブラリにも依存関係 (依存関係グラフのさらに下) を持っているため、起動時に競合が発生することです。さらに、この投稿で示唆されているように、webapp-runner を 7.0.22.1 にダウングレードすることはできません。
したがって、Spymemcached を hibernate-memcached 依存関係から除外して、webapp-runner の Spymemcached ソースのみが含まれるようにするのは簡単なことだと思いました。
<dependency>
<groupId>com.googlecode</groupId>
<artifactId>hibernate-memcached</artifactId>
<version>1.3</version>
<exclusions>
<exclusion>
<artifactId>hibernate</artifactId>
<groupId>org.hibernate</groupId>
</exclusion>
<exclusion>
<groupId>spy</groupId>
<artifactId>spymemcached</artifactId>
</exclusion>
</exclusions>
</dependency>
しかし、何らかの理由で、アプリケーションコンテキストで指定した memcachedClient を作成するファクトリ Bean で、起動時にまだ競合が発生します。
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">...</bean>
悪名高い java.lang.NoClassDefFoundError が発生します。
Error loading class [net.spy.memcached.spring.MemcachedClientFactoryBean] for bean with name 'memcachedClient' defined in file [/home/markus/coding/reader/target/tomcat.8080/work/Tomcat/localhost/_/WEB-INF/classes/META-INF/spring/applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/springframework/beans/factory/FactoryBean
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:353)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:153)...
IDE で MemcachedClientFactoryBean を検索すると、hibernate-memcached ではなく、webapp-runner によって利用可能になっていることがわかります。そのため、除外によって何かが正しく行われたように見えます。
ここで明らかな何かが欠けていますか?この NoClassDefFoundError を取り除くにはどうすればよいですか?