나는 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>
나는 종류의이 시점에서 붙어있어합니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?
유망한 것 같습니다. 나는 모든 종류의 항아리를 부두에 던져 그것을 고치려고했다. 프로젝트 종속성, 플러그인 종속성, lib 폴더에 있으며 extraClasspath에 포함됩니다. 나는 그것을 시도 할 것이다. – hisdrewness
이걸 보면서 잠시 지났지 만 항아리에 대한 플러그인 의존성 만 있으면서도 pom (그리고 기본적으로 lib는 내 전쟁이 어떻게 만들어 졌는지)을 제거하거나 의존성 범위 제공됨. – hisdrewness