JETTY에서 HSF를 제대로 사용할 수 없는 문제 해결

4599 단어 jetty
main 함수를 썼어요.
	public static void main(String[] arg) throws Exception {
		HSFContainerDelegator.start("D:\\j2ee_solution\\hsf-plugin");

		System.out.println(Thread.currentThread().getContextClassLoader());

		Class<?> clazz = Class
				.forName("com.taobao.hsf.app.spring.util.HSFSpringConsumerBean");

		System.out.println(clazz);
	}

 
현재classpath에서 osgi 용기를 통해 불러오지 않습니다. 이것은main 함수에서 정상적으로 사용할 수 있습니다. 그러나 jetty를 용기로 하는 웹 서비스가 시작될 때 Spring을 통해 불러오면 이상이 발생합니다. 아래와 같습니다.
public class HsfBootup implements InitializingBean {

	@Override
	public void afterPropertiesSet() throws Exception {
		HSFContainerDelegator.start("D:\\j2ee_solution\\hsf-plugin");
		Class<?> clazz = Class
				.forName("com.taobao.hsf.app.spring.util.HSFSpringConsumerBean");

		System.out.println("======================" + clazz);
	}}

 
같은 코드는 앞은main 함수를 통해 시작하고, 뒤는jetty를 통해spring을 간접적으로 사용하지만 후자는 이상을 던진다.
왜 이러지?
그럼 먼저 두 장면에서classloader가 어떻게 다른지 봅시다.
  • main 함수 중의classloader는 sun.misc.Launcher$AppClassLoader@19821f
  • jetty 용기에 불러오는 classloader는class org입니다.mortbay.jetty.webapp.WebAppClassLoader 

  • 응, 보아하니 두 장면에서의classloader는 다른 것 같아. classloader가 다르기 때문에class가 불러오지 않는 것 같아.
    두 번째 장면에서class가 불러오지 않아서 던진 이상 정보를 보십시오.
    java.lang.ClassNotFoundException: com.taobao.hsf.app.spring.util.HSFSpringConsumerBean
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
            at org.codehaus.classworlds.RealmClassLoader.loadClassDirect(RealmClassLoader.java:195)
            at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:255)
            at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:274)
            at org.codehaus.classworlds.RealmClassLoader.loadClass(RealmClassLoader.java:214)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
            at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:401)
            at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
            at org.springframework.util.ClassUtils.forName(ClassUtils.java:211)
            at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:385)
            at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1138)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.j
    ava:524)
            at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1177)
            at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:758)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:422
    )
            at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:72
    8)
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
            at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
            at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
            at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
            at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
            at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)

    인터넷에서 제티의classloader 불러오는 메커니즘http://docs.codehaus.org/display/JETTY/Classloading을 찾았는데 그 중에서 org를 언급했다.mortbay.jetty.webapp.WebAppClassLoader는 jetty의 기본적인classloader입니다.

    좋은 웹페이지 즐겨찾기