1

我有一个使用 Spymemcached 库的 Heroku Java 应用程序,在我的例子中,我使用了 hibernate-memcached 库(1.3)。

我现在需要确保对我的应用程序的所有请求都通过 HTTPS。这让我看到了这篇文章,其中解决方案的重点是利用 webapp-runner 插件和一些配置来为我的应用程序获取正确的标头(您为运行器提供 context.xml)。

我的问题是 webapp-runner 插件对 Spymemcached 库也有依赖关系(在依赖关系图的下方),这会导致启动时发生冲突。此外,我不能按照本文的建议将 webapp-runner 降级到 7.0.22.1 因为对指定 context.xml 的支持是在事后才出现的。

所以我认为将 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 时,我可以看到它是由 webapp-runner 而不是 hibernate-memcached 提供的,因此排除似乎做了正确的事情。

我在这里遗漏了一些明显的东西吗?如何摆脱这个 NoClassDefFoundError?

4

1 回答 1

1

仅供参考,我发现 webapp-runner 的 7.0.22 版本确实支持通过运行为其提供 context.xmljava -jar target/webapp-runner.jar --help

... --context_xml ...它与您指定而不是的更高版本略有不同... --context-xml ...

版本 7.0.22 的 webapp-runner 没有 Spymemcached 作为依赖,这解决了这个问题。

于 2013-06-17T16:52:48.260 回答