2012-12-11 4 views
1

Je télécharge un fichier jar de façon dynamique via servlet et l'enregistre dans mon répertoire WEB-INF/lib. Je veux obtenir toutes les classes annotées avec mon @annotation,Chargement des classes à partir d'un fichier jar qui est téléchargé dynamiquement via un servlet

ont utilisé le code de réflexions ci-dessous sans chance .. le manifeste du pot est retranscrit mais les classes ne sont pas .. la liste des classes est 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); 

Quels changements à la configuration aidera à obtenir les classes du pot dynamiquement téléchargé ..

Répondre

0

Puisque vous mettez à jour votre propre répertoire WEB-INF/lib il est pas nécessairement pris par votre chargeur de classe de contexte. BTW Je pense que c'est une mauvaise pratique: le comportement dépend du serveur d'application et ce répertoire n'est probablement pas accessible en écriture et n'existe même probablement pas si vous utilisez la guerre ...

Alors, je mettrais le pot dans un autre répertoire et utilisez mon chargeur de classe personnalisé. Ce n'est pas si dur. Vous pouvez utiliser régulièrement UrlClassLoader. Il suffit de le configurer pour lire les classes du bon chemin. Une fois cela fait passer ce chargeur de classe lorsque vous créez l'instance de Reflections. Jetez un oeil sur son javadcoc. Le constructeur peut exclure différents types de paramètres, y compris le chargeur de classe.

+0

J'ai créé un URLClassLoader et ajouté à la classLoadersList mais les questions reste encore. essayer de charger une classe throws ClassNotFoundException .. J'ai également séparé le pot de la bibliothèque ne stockant pas le jar téléchargé dans un dossier distinct .. pouvez-vous m'aider avec un exemple de code d'urlclassloader avec des réflexions ..? –

0

de votre classe d'auditeur (ou peu importe où ServletContext est disponible), essayez d'utiliser:

new Reflections(ClasspathHelper.forWebInfClasses(servletContext)) 

ou

new Reflections(ClasspathHelper.forWebInfLib(servletContext)) 
Questions connexes