2012-03-28 96 views
3

我只是想知道爲什麼我無法使用Felix OSGi中的線程上下文加載資源?我不應該觸摸上下文加載器,我做錯了什麼或者是一個錯誤?使用上下文加載程序加載資源失敗,出現NullPointerException

我有一個超級簡單的包用一個簡單的激活:

public class Activator implements BundleActivator { 
    public void start(BundleContext context) throws Exception { 
     System.out.println("Hello World!!"); 
     String resourcePath = "META-INF/mySuperDuperResource.txt"; 

     // works 
     System.out.println(Activator.class.getClassLoader().getResource(resourcePath)); 
     // null-pointer exception 
     System.out.println(Thread.currentThread().getContextClassLoader().getResource(resourcePath)); 

    } 
    public void stop(BundleContext context) throws Exception { 
     System.out.println("Goodbye World!!"); 
    } 
} 

現在正在加載的資源用的類加載器與Activator.class.getClassLoader工作。但是不能與Thread.currentThread()。getContextClassLoader()。在那裏,我得到:當只設置線程上下文類加載器

ERROR: Bundle info.gamlor.osgi [26] Unable to get module class path. (java.lang.NullPointerException) 
java.lang.NullPointerException 
     at org.apache.felix.framework.BundleRevisionImpl.calculateContentPath(BundleRevisionImpl.java:410) 
     at org.apache.felix.framework.BundleRevisionImpl.initializeContentPath(BundleRevisionImpl.java:347) 
     at org.apache.felix.framework.BundleRevisionImpl.getContentPath(BundleRevisionImpl.java:333) 
     at org.apache.felix.framework.BundleRevisionImpl.getResourceLocal(BundleRevisionImpl.java:472) 
     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1432) 
     at org.apache.felix.framework.BundleWiringImpl.getResourceByDelegation(BundleWiringImpl.java:1360) 
     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.getResource(BundleWiringImpl.java:2256) 
     at info.gamlor.osgi.Activator.start(Activator.java:23) 
     at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641) 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977) 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:1895) 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944) 
     ... 
org.osgi.framework.BundleException: Activator start error in bundle info.gamlor.osgi [29]. 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:2027) 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:1895) 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944) 
     at org.apache.felix.gogo.command.Basic.start(Basic.java:729) 
     ... 
Caused by: java.lang.NullPointerException 
     at org.apache.felix.framework.BundleRevisionImpl.getResourceLocal(BundleRevisionImpl.java:474) 
     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1432) 
     at org.apache.felix.framework.BundleWiringImpl.getResourceByDelegation(BundleWiringImpl.java:1360) 
     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.getResource(BundleWiringImpl.java:2256) 
     at info.gamlor.osgi.Activator.start(Activator.java:23) 
     at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641) 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977) 
     ... 32 more 

現在它工作得很好:

Thread.currentThread().setContextClassLoader(Activator.class.getClassLoader()); 

但是,這有一個哈克的感覺吧。這樣的感覺會在稍後咬我。

回答

4

我不知道爲什麼你會驚訝這發生。默認情況下,一個線程的上下文類加載器被設置爲它的父類的類加載器,它在開始時被設置爲系統類加載器。所以,假設你沒有做任何特別的事情,上下文類加載器就是系統類加載器,它與你的bundle的類加載器不一樣,因此它找不到你的資源。

我同意設置上下文classloader有一個hacky的感覺,但有些庫需要這樣。我會做類似的,

ClassLoader previous = Thread.currentThread().getContextClassLoader(); 
Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 
badlyBehavedLibraryCall(); 
Thread.currentThread().setContextClassLoader(previous); 
+0

那麼我很奇怪的例外。如果資源不可見,通常會返回空白。好的,我會保留我的班加載器設置。當然,最後再試一試。 – Gamlor 2012-03-29 12:37:49

相關問題