2012-01-04 5 views
1

Jboss 6에는 구현시 JPA 2.0 (hibernate-jpa-2.0-api.jar) 및 Hibernate 3.6.6이 함께 제공됩니다.Jboss 6.0에서 OpenJPA를 사용하는 ClassCastException

OpenJPA 2.0 라이브러리 (openjpa-all-2.1.0.jar)가있는 웹 응용 프로그램이 있습니다. 이름 = 지속성 : 나는 ERROR [AbstractKernelController] 오류

이 시작 설치이 오류를 얻을 응용 프로그램을 배포 할 때

<class-loading java2ClassLoadingCompliance="false"> 
    <loader-repository> 
     some.example:loader=some-webapp.war 
     <loader-repository-config>java2ParentDelegation=false</loader-repository-config> 
    </loader-repository> 
</class-loading> 

아래와 같이 나는 보스 - web.xml의 클래스 로더 격리를 설정 한 .unit : unitName = some.war # 어떤 상태 = 만들기 : java.lang.ClassCastException가를 : org.apache.openjpa.persistence.PersistenceProviderImpl이 javax.persistence.spi.PersistenceProvider 캐스트 할 수없는

이 때문에 이상하다 , org.apache.openjpa.persistence.PersistenceProviderImpl 이미

javax.persistence.spi.PersistenceProvider 내가 javax.persistence.spi.PersistenceProvider가로드되는 위치를 확인하기 위해 -version:class했다 구현하고 그것을 처음 다음 웹 응용 프로그램에서로드되는 것 것으로 보인다 jboss6\common\lib

[로드 javax.persistence.spi에서 .PersistenceProviderResolverHolder $ 1 from vfs : /home/sathwik/apps/jboss-6.1.0.Final/server/default/deploy/some-webapp.war/WEB-INF/lib/openjpa-all-2.1.0.jar/]

[vfs에서로드 된 javax.persistence.spi.PersistenceProvider : /home/sathwik/apps/jboss-6.1.0.Final/common/lib/ 최대 절전 모드에서 JPA-2.0-api.jar을은 /] 내가 hibernate-jpa-2.0-api.jar을 컴파일하는 데 사용되는 JDK 버전을 수집 할 수 있었다 Manifest.mf 파일에서

Build-Jdk: 1.5.0_19로 컴파일 openjpa-all-2.1.0Build-Jdk: 1.6.0_22

로 컴파일 수 아무도 왜이 예외를 이해하는 데 도움이 될까요? OpenJPA Dependencies page에 따르면

답변

3

openjpa-all JAR 파일

[...]를는 OpenJPA의 핵심 코드 플러스 당신은 실행하지 않는

자바 SE에 대한 런타임 종속성의 모든 환경을 포함 JavaSE 환경에서 사용자는 완전한 JavaEE 환경에 있으며 여기에는 이미 openjpa-all JAR에 포함 된 부수적 인 API 클래스가 많이 있습니다. 결과적으로 동일한 이름의 클래스를로드하지만 다른 클래스 로더로 인해 충돌이 발생합니다.

openjpa-all을보다 구체적인 JAR 파일 (예 : openjpa-2.1.0.jar 및 다른 파일이 작동하는 데 필요한 것 - 위의 페이지 참조)로 바꿔야합니다.

+0

skaffman, 빠른 답장을 보내 주셔서 감사합니다. openjpa-all 대신 openjpa-2.1.0.jar을 배포 한 후 응용 프로그램을 배포 할 수있었습니다. – Sathwik

+0

여기서 클래스 로더의 상황을 설명 할 수 있습니까? 왜 ClassCastException을 발생 시키는가? – Sathwik

+1

@Sathwick : 자바는 이름이 같고 바이트 코드가 같더라도 다른 클래스 로더에서로드 된 클래스를 다르게 취급합니다.이러한 클래스간에 객체를 캐스팅하려고하면 예외가 발생합니다. 특정 클래스에 사용되는 클래스 로더는 특히 JBoss와 같은 복잡한 환경에서 예측하기가 어려울 수 있습니다. – skaffman