1

私は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 を取り除くにはどうすればよいですか?

4

1 に答える 1

1

参考までに、webapp-runner のバージョン 7.0.22 は、実行して context.xml を提供することを実際にサポートしていることがわかりました。java -jar target/webapp-runner.jar --help

... --context_xml ...代わりに指定する後のバージョンとは少し異なります... --context-xml ...

webapp-runner のバージョン 7.0.22 には依存関係として Spymemcached がないため、問題が解決されます。

于 2013-06-17T16:52:48.260 に答える