2014-01-15 1 views
1

나는 전쟁에서 jar를 동적으로로드하고 있습니다. jar에는 bean으로 등록하려는 일부 Java 클래스가 들어 있습니다. 코드는동적으로 외부 jar 추가 및 Spring에서 클래스로 클래스 등록하기

로드 jar 파일을 동적

Resource jarFile = appContext.getResource("file:" +<jar_file_path>); 
URL url = jarFile.getURL(); 
URL[] urls = new URL[] { url };    
ClassLoader classLoader = appContext.getClassLoader(); 

로드 클래스처럼 보이는 Spring 애플리케이션 컨텍스트

Class<?> daoClass = classLoader.loadClass("com.myclass"); 
Object daoObj = appContext.getAutowireCapableBeanFactory().createBean(daoClass); 

그러나 이것은 DAO 클래스를로드에서 빈으로 등록합니다. 이제 dao 클래스의 종속성이있는 서비스 클래스를로드하면 다음 예외가 발생하여 실패합니다.

발생 원인 : org.springframework.beans.factory.NoSuchBeanDefinitionException : 종속성에 대해 [com.myclass] 유형의 정규화 된 Bean이 없습니다. :이 종속성에 대한 autowire 후보로 자격이있는 적어도 하나의 bean이 필요합니다. 의존성 주석 ​​: org.springframework.beans.factory에서 {@ javax.annotation.Resource (shareable = true, mappedName =, description =, name =, type = 클래스 java.lang.Object, authenticationType = CONTAINER, lookup =)} org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency에서 .support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:988) org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:858)에서 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource에서 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource (CommonAnnotationBeanPostProcessor.java:440) 에서 (DefaultListableBeanFactory.java:770) (CommonAnnotationBeanPostProcessor. 자바 : 418) org.springframework.context.annotation.CommonAnnotationBeanPostProcessor $ ResourceElement.getResourceToInject (CommonAnnotationBeanPostProcessor.java:546) 사전

+0

스택 추적을 게시 할 수 있습니까? 예외는 Spring 내에서 발생합니까? 아니면 classLoader.loadClass ("com.myclass");에서 발생합니까? com.myclass 또는 com.myclass의 종속성과 관련된 예외입니까? –

+0

클래스 로더를 변경하여로드 할로드를 얻을 수 있고 이로 인해 Bean이로드됩니다. 그러나 이제는 종속성보다 두 번째 클래스를로드 할 때 실패합니다. 나는 코드를 수정했다. – lalit

답변

0

에서

덕분에 나는 당신이 서블릿 컨테이너에서 실행한다고 가정? 그렇다면 을 사용하여 URLClassloader 클래스를로드 할 수 없습니다. 그 길은 존재하지 않고 전쟁 안에 있습니다.

단지가 WEB-INF/lib 인 것을 확인하면 Class.forName("com.myclass")이 될 수 있습니다.

관련 문제