Jetty Classloading问题

时间:2012-02-03 18:42:22

标签: java servlets jetty jndi

我正在使用jetty maven插件在本地运行webapp,当我尝试引入JNDI资源时,我得到了一个类转换异常。

我有一个带有资源对象的jetty配置,这是一个通过JNDI使用的配置bean。此类驻留在lib目录中的类路径上的另一个jar中:

<Configure class="org.mortbay.jetty.Server">
    <New class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>config/MyConfigObject</Arg>
        <Arg>
            <New class="my.config.ConfigObject">
                <Set name="foo">bar</Set>
            </New>
        </Arg>
    </New>
</Configure>

这是通过Spring检索的:

<bean id="MyConfigObject" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/config/MyConfigObject" />
</bean>

在servlet内部,我手动抓取对象:

final MyConfigObject config = (MyConfigObject) applicationContext.getBean("MyConfigObject");

但是当我尝试访问servlet时,我得到了:

java.lang.ClassCastException: my.config.MyConfigObject cannot be cast to my.config.MyConfigObject

我很确定这个问题是由于课程加载造成的,但我并不是100%肯定。 MyConfigObject的类加载器是默认的sun类加载器,而线程的当前类加载器是jetty的WebAppClassLoader。我的jar在WEB-INF / lib中,我甚至在maven插件配置中手动将它添加到extraClasspath:

<plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.25</version>
                <configuration>
                    <jettyConfig>${basedir}/test/jetty.xml</jettyConfig>
                    <webAppSourceDirectory>${basedir}/target/${project.artifactId}</webAppSourceDirectory>
                    <webXml>${basedir}/war/WEB-INF/web.xml</webXml>
                    <webAppConfig>
                        <extraClasspath>${basedir}/target/${project.artifactId}/WEB-INF/lib/myConfigJar-1.0.jar</extraClasspath>
                    </webAppConfig>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>testing</groupId>
                        <artifactId>myConfigJar</artifactId>
                        <version>1.0</version>
                    </dependency>
                </dependencies>
            </plugin>

我有点陷入困境。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

问题是你已经在很多地方列出了jar - 你试图将它添加到extraClasspath实际上会让它变得更糟,而不是更好。

你说它在WEB-INF/lib,但我认为它也被列为pom.xml

中的依赖项

你不想这样做,你需要有一个单一的引用。作为pom.xmllib目录或extraClasspath目录中的依赖项,但仅限于1个位置。

(提示:pom.xml几乎肯定是正确的地方,摆脱其他人)

答案 1 :(得分:0)

你的webapp 包含“my.config.MyConfigObject”类(和相关类)。

潜在的问题是你正在通过2个不同的类加载器加载类。您需要从webapp类加载器中删除该类,以便您的webapp将使用与jetty使用的相同的类。