2012-02-03 59 views
0

我正在使用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> 

我那种停留在这一点上。有谁知道如何解决这个问题?

回答

1

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

你说这是在WEB-INF/lib,但我相信它也被列为依赖关系的pom.xml

你不想这样做,你需要有1个单参考吧。作为您的pom.xml或您的lib目录或extraClasspath中的依存项,但仅在1个地方。

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

+0

这听起来很有希望。我在码头扔了各种罐子,试图修理它。它是一个项目依赖项,一个插件依赖项,它位于lib文件夹中,并包含在extraClasspath中。我会尝试的。 – hisdrewness 2012-02-08 06:17:41

+0

我看了这一段时间已经有一段时间了,但是我通过对jar的插件依赖性来解决它,并且从pom中移除了依赖关系(并且本质上是lib,因为这是我的战争的构建方式),或者设置依赖关系作用域提供。 – hisdrewness 2012-03-20 14:09:27

0

你的web应该是而不是在其中包含“my.config.MyConfigObject”类(和相关的类)。

潜在的问题是您正在获取由2个不同的类加载器加载的类。你需要从你的webapp类加载器中消除这个类,这样你的web应用程序将使用与jetty使用的类相同的类。

+0

你能否详细说明什么“包括”手段?这个类不是webapp项目的一部分。它位于类路径中的依赖项目中。 – hisdrewness 2012-02-03 19:29:24

+0

webapp本身没有什么应该引用jar。它应该只在码头的classpath上。 – jtahlborn 2012-02-03 21:13:14