2012-02-03 63 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