我正在使用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>
我有点陷入困境。有谁知道如何解决这个问题?
答案 0 :(得分:1)
问题是你已经在很多地方列出了jar - 你试图将它添加到extraClasspath
实际上会让它变得更糟,而不是更好。
你说它在WEB-INF/lib
,但我认为它也被列为pom.xml
你不想这样做,你需要有一个单一的引用。作为pom.xml
或lib
目录或extraClasspath
目录中的依赖项,但仅限于1个位置。
(提示:pom.xml
几乎肯定是正确的地方,摆脱其他人)
答案 1 :(得分:0)
你的webapp 不包含“my.config.MyConfigObject”类(和相关类)。
潜在的问题是你正在通过2个不同的类加载器加载类。您需要从webapp类加载器中删除该类,以便您的webapp将使用与jetty使用的相同的类。