2012-12-11 32 views
1

我通過servlet動態上傳jar並將其保存在我的WEB-INF/lib目錄中。 我想用我的@annotation註釋的所有類,從通過servlet動態上傳的jar中加載類

已經使用下面的反射代碼沒有任何的運氣..罐子的清單是readble但這些類不是..類列表是0

List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>(); 
classLoadersList.add(ClasspathHelper.contextClassLoader()); 
classLoadersList.add(ClasspathHelper.staticClassLoader()); 
ConfigurationBuilder builder = new ConfigurationBuilder().setScanners(new SubTypesScanner(false), new ResourcesScanner(), 
new TypeAnnotationsScanner()); 
Set<URL> set = ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])); 
     FilterBuilder filterBuilder = new FilterBuilder().include(FilterBuilder.prefix(exportPackage)); 
     Reflections reflections = new Reflections(builder.setUrls(set).filterInputsBy(filterBuilder)); 

     Set<Class<? extends Object>> classSet = reflections.getTypesAnnotatedWith(MyAnnotation.class); 

什麼更改配置將有助於從動態上載的罐子得到的類..

回答

0

既然要更新自己的WEB-INF/lib目錄它並不一定是你的上下文類加載器捕獲。順便說一句我認爲這是一個不好的做法:行爲取決於應用程序服務器,這個目錄可能不可寫,甚至可能不存在,如果你是從戰爭運行...

所以,我會把罐子到其他目錄並使用我的自定義類加載器。這並不難。您可以使用常規的UrlClassLoader。只需將其配置爲從正確的路徑讀取類。完成此操作後,當您創建Reflections的實例時,請通過此類加載器。看看它的javadcoc。構造函數可以包括各種類型的參數,包括類加載器。

+0

我創建了一個URLClassLoader的,並把它添加到classLoadersList,但仍然還是問題。 。試圖加載一個類拋出ClassNotFoundException ..我也分開了jar的lib沒有存儲上傳的jar在一個單獨的文件夾..你能幫我一些示例代碼urlclassloader與思考..? –

0

從監聽器類(或在任何地方參數servletContext可用),請嘗試使用:

new Reflections(ClasspathHelper.forWebInfClasses(servletContext)) 

new Reflections(ClasspathHelper.forWebInfLib(servletContext))