我正在使用jetty maven插件在本地运行Web应用程序,并且在尝试拉入JNDI资源时收到类转换异常。Jetty Classloading问题
我有一个资源对象的jetty配置,它是通过JNDI使用的配置bean。这个类位于classpath中的不同的罐子是在lib目录:
<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
。我的罐子是在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>
我那种停留在这一点上。有谁知道如何解决这个问题?
这听起来很有希望。我在码头扔了各种罐子,试图修理它。它是一个项目依赖项,一个插件依赖项,它位于lib文件夹中,并包含在extraClasspath中。我会尝试的。 – hisdrewness 2012-02-08 06:17:41
我看了这一段时间已经有一段时间了,但是我通过对jar的插件依赖性来解决它,并且从pom中移除了依赖关系(并且本质上是lib,因为这是我的战争的构建方式),或者设置依赖关系作用域提供。 – hisdrewness 2012-03-20 14:09:27