2011-03-17 4 views
8

Karaf OSGi 컨테이너 내부에서 WAR 파일을 실행하려고합니다. 이 응용 프로그램은 독립 실행 형 부두 6.1.26에서 제대로 실행되지만 응용 프로그램이 Karaf의 내부에서 실행될 때, 나는 다음과 같은 예외와 Karaf 인스턴스가 정지 얻을 : 응용 프로그램이 최대 절전 모드에 의존하지 않는 것을Spring을 얻는 방법 JPA, Hibernate 및 OSGi가 멋지게 재생 되나요?

WARN org.hibernate.ejb.packaging.InputStreamZippedJarVisitor - Unable to find 
file (ignored): bundle://125.0:240/ java.lang.NullPointerException: in is null 

주 별도의 OSGi 번들에서; WEB-INF/lib에 최대 절전 모드 병이 포함되어 있습니다.

이 게시물의 정보를 검토했습니다 : Equinox (OSGi) and JPA/Hibernate - Finding Entities. 그러나, 애플리케이션은 Hibernate를 직접 사용하지 않고 JPA를 사용하고있다. 응용 프로그램의 구성은이 게시물의 두 번째 옵션 인 Difference between configuring data source in persistence.xml and in spring configuration files과 매우 비슷합니다. 따라서, 나는 annotatedClasses 속성을 설정할 수있는 Hibernate SessionFactory에 대한 핸들을 가지고 있지 않다.

예외를 피하는 방법에 대한 아이디어가 있으십니까?

답변

4

나는 저자와 병행하여 작업했으며, 향후이 문제를 해결할 사람을 위해 해결책을 게시 할 것입니다.

Hibernate가 영속 클래스를 찾기 위해 jar 파일의 압축을 풀려고하기 때문에 예외가 발생합니다. 다른 글에서 언급했듯이, OSGi는 Hibernate가 클래스 로더처럼 동작하는 것을 허용하지 않기 때문에 실패합니다. 솔루션은 손으로로드해야하는 클래스를 모두 지정하고 다른 클래스를로드하지 않도록 지시하는 것입니다.

persistence.xml 파일과 orm.xml 파일을 사용했습니다 (기본 이름을 사용 했으므로 applicationContext.xml에 지정하지 않아도됩니다).

우리의 persistence.xml 파일은 <mapping-file> 태그를 사용하여 간단히 orm.xml을 가리 킵니다. 최대 절전 모드에서 추가 클래스를로드하지 못하도록하는 <exclude-unlisted-classes/> 태그도 포함되었습니다.

orm.xml 파일은로드해야하는 모든 엔티티 클래스를 호출하기 위해 <entity class="path.to.my.class" metadata-complete="false"/> 파일을 사용했습니다. metadata-complete 부분은 구성을 완료하기 위해 클래스에서 발견 된 주석을 사용하기 위해 최대 절전 모드를 지시한다.

+1

Spring JPA persistence.xml 파일의 예는 [Spring Framework 참조 매뉴얼 12.6.1.3] (http://static.springsource.org/spring/docs/2.5.x/reference/)을 참조하십시오. orm.html).이 솔루션의 경우 orm.xml 파일에는 @Entity 주석이 포함 된 각 클래스의 완전한 클래스 이름을 가진''요소와 중첩 된' '요소 만 포함되었습니다. 'metadata-complete = "false"'속성은 hibernate에게 클래스 자체에 지정된 주석으로부터 orm.xml 파일에 명시되지 않은 모든 데이터 (이 경우 모두)를 읽도록 지시한다. – Adam

관련 문제