2012-02-03 2 views
0

나는 jetty maven 플러그인을 사용하여 로컬에서 webapp를 실행하고 있으며 JNDI 리소스를 가져올 때 클래스 캐스팅 예외가 발생합니다.부두 클래스로드 문제

JOBI를 통해 사용되는 구성 빈인 자원 객체가있는 부두 구성이 있습니다.

<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> 

이 봄을 통해 검색되는 :

는 서블릿의 내부
<bean id="MyConfigObject" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/config/MyConfigObject" /> 
</bean> 

, 내가 수동으로 개체를 잡아하고있어이 클래스는 lib 디렉토리에있는 클래스 경로의 다른 항아리에 있습니다 : 내가 서블릿에 액세스하려고 할 때

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

는하지만, 내가 얻을 :

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

문제는 클래스 로딩으로 인한 것 같지만 100 % 확실하지는 않습니다. MyConfigObject의 클래스 로더는 기본 sun 클래스 로더이며 스레드의 현재 클래스 로더는 jetty의 WebAppClassLoader입니다. 내 병은 WEB-INF는/lib에, 그리고 심지어 구성 플러그인 받는다는에 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에있어 말하지만, 나는 그것이도에 종속성으로 열거 된 가정 당신의 당신은 당신이 1 단일 참조가 필요, 그렇게하고 싶지 않아 pom.xml

. pom.xml 또는 lib 디렉토리 또는 extraClasspath의 종속성 중 하나이지만 한 곳에서만 존재합니다.

: 수단을 무엇을 '포함'에

+0

유망한 것 같습니다. 나는 모든 종류의 항아리를 부두에 던져 그것을 고치려고했다. 프로젝트 종속성, 플러그인 종속성, lib 폴더에 있으며 extraClasspath에 포함됩니다. 나는 그것을 시도 할 것이다. – hisdrewness

+0

이걸 보면서 잠시 지났지 만 항아리에 대한 플러그인 의존성 만 있으면서도 pom (그리고 기본적으로 lib는 내 전쟁이 어떻게 만들어 졌는지)을 제거하거나 의존성 범위 제공됨. – hisdrewness

0

webapp는 이 아니고에는 "my.config.MyConfigObject"클래스 (및 관련 클래스)가 포함되어 있어야합니다.

근본적인 문제는 두 개의 다른 클래스 로더가 클래스를로드하고 있다는 것입니다. 웹 애플리케이션이 부두가 사용하는 클래스를 사용하도록 클래스를 웹 애플리케이션 클래스 로더에서 제거해야합니다.

+0

당신이 정교한 (힌트 pom.xml는 다른 사람을 제거 거의 확실히 바로 이곳입니다)? 이 클래스는 webapp 프로젝트의 일부가 아닙니다. classpath에있는 종속 프로젝트에 있습니다. – hisdrewness

+0

webapp 자체의 아무것도 항아리를 참조해야합니다. 부두의 classpath에만 있어야합니다. – jtahlborn