Problème avec la fonction Resource.getURLs(String pattern);
Bonjour, Dans une application, j'ai besoin de rechercher des resources en fonction d'un pattern, pour cela j'ai utilisé la fonction Resource.getURLs(String pattern) mais qui par défaut recherche dans le system classloader. De plus, ayant un class loader personnalisé, je ne peux pas utiliser la fonction Resource.getURLs(String pattern, URLClassLoader classLoader) car je ne suis pas sur que mon classloader: Thread.currentThread().getContextClassLoader() etend URLClassLoader. J'ai trouvé un autre code qui permet de recherche des patterns dans un simple ClassLoader dans... Spring. http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/cor... Voici un exemple d'utilisation : PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(Thread.currentThread().getContextClassLoader()); Resource[] resources = resolver.getResources("classpath:/validators/fr/ifremer/coser/data/*.xml"); for (Resource resource : resources) { URL url = resource.getURL(); ... } Je n'ai pas trop regardé comment ils faisaient, mais ca a résolu le fonctionnement en local et en java web start sans trop de developpement. Mais j'ai une dépendance sur Spring :( -- Éric <chatellier@codelutin.com> Tel: 02 40 50 29 28 http://www.codelutin.com
On Thu, 10 Feb 2011 11:09:56 +0100 Eric Chatellier <chatellier@codelutin.com> wrote:
Bonjour,
Dans une application, j'ai besoin de rechercher des resources en fonction d'un pattern, pour cela j'ai utilisé la fonction Resource.getURLs(String pattern) mais qui par défaut recherche dans le system classloader.
De plus, ayant un class loader personnalisé, je ne peux pas utiliser la fonction Resource.getURLs(String pattern, URLClassLoader classLoader) car je ne suis pas sur que mon classloader: Thread.currentThread().getContextClassLoader() etend URLClassLoader.
J'ai trouvé un autre code qui permet de recherche des patterns dans un simple ClassLoader dans... Spring. http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/cor...
Voici un exemple d'utilisation :
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(Thread.currentThread().getContextClassLoader()); Resource[] resources = resolver.getResources("classpath:/validators/fr/ifremer/coser/data/*.xml"); for (Resource resource : resources) { URL url = resource.getURL(); ... }
Je n'ai pas trop regardé comment ils faisaient, mais ca a résolu le fonctionnement en local et en java web start sans trop de developpement.
Mais j'ai une dépendance sur Spring :(
-100 : perso je veux vraiment pas aucune deps autre que du commons dans nuiton-utils (et ben aussi si je me souviens bien). Y'a d'autres libs qui font ça dans commons je crois. La question que je me poserais plutôt à ta place c'est suis-je vraiment obligé de faire ça ? car l'expérience me fait dire que c'est très souvent pas nécessaire et que c'est un truc vraiment bourrin avec des performances pas très bonnes (voire catastrophique si tu as un class-path énorme). De plus dans ton cas présent je vois bien que tu cherches les fichiers de validations et si tu utilises nuiton-validator ton problème va disparaître car tu n'as pas à gérer ça... au fait t'en es où du passage de coser sur nuiton-validator ? -- Tony Chemit -------------------- tél: +33 (0) 2 40 50 29 28 email: chemit@codelutin.com http://www.codelutin.com
Le 10/02/2011 11:33, chemit a écrit :
-100 : perso je veux vraiment pas aucune deps autre que du commons dans nuiton-utils (et ben aussi si je me souviens bien). Ce n'etait pas le but de mettre ce code dans nuiton-utils, juste présenter un cas concret où elle n'est pas utilisable. La question que je me poserais plutôt à ta place c'est suis-je vraiment obligé de faire ça ? car l'expérience me fait dire que c'est très souvent pas nécessaire et que c'est un truc vraiment bourrin avec des performances pas très bonnes (voire catastrophique si tu as un class-path énorme).
De plus dans ton cas présent je vois bien que tu cherches les fichiers de validations et si tu utilises nuiton-validator ton problème va disparaître car tu n'as pas à gérer ça... Si car dans coser l'utilisateur peut modifier les fichiers de validation, et ils sont enregistrés sur le disque. au fait t'en es où du passage de coser sur nuiton-validator ? J'attends la présentation dev, c'est pour ca que j'avais fait une présentation coser avant, pour illustrer les problèmes
-- Éric <chatellier@codelutin.com> Tel: 02 40 50 29 28 http://www.codelutin.com
On Thu, 10 Feb 2011 11:35:05 +0100 Eric Chatellier <chatellier@codelutin.com> wrote:
Le 10/02/2011 11:33, chemit a écrit :
-100 : perso je veux vraiment pas aucune deps autre que du commons dans nuiton-utils (et ben aussi si je me souviens bien). Ce n'etait pas le but de mettre ce code dans nuiton-utils, juste présenter un cas concret où elle n'est pas utilisable. La question que je me poserais plutôt à ta place c'est suis-je vraiment obligé de faire ça ? car l'expérience me fait dire que c'est très souvent pas nécessaire et que c'est un truc vraiment bourrin avec des performances pas très bonnes (voire catastrophique si tu as un class-path énorme).
De plus dans ton cas présent je vois bien que tu cherches les fichiers de validations et si tu utilises nuiton-validator ton problème va disparaître car tu n'as pas à gérer ça... Si car dans coser l'utilisateur peut modifier les fichiers de validation, et ils sont enregistrés sur le disque. au fait t'en es où du passage de coser sur nuiton-validator ? J'attends la présentation dev, c'est pour ca que j'avais fait une présentation coser avant, pour illustrer les problèmes
Je vois pas où peux survenir le problème ? il suffit de recharger la configuration de tes modèles de validations rien de bien sorcier et rien qui ne t'empèche de passer sur nuiton-validator ? -- Tony Chemit -------------------- tél: +33 (0) 2 40 50 29 28 email: chemit@codelutin.com http://www.codelutin.com
On Thu, 10 Feb 2011 11:33:33 +0100 chemit <chemit@codelutin.com> wrote:
Mais j'ai une dépendance sur Spring :(
-100 : perso je veux vraiment pas aucune deps autre que du commons dans nuiton-utils (et ben aussi si je me souviens bien).
Je ne pense pas qu'Eric est ajouté une dépendance dans nuiton-utils. Mais plutôt que dans son projet, il a une dépendance spring au lieu de nuiton-utils. (ou alors c vraiment tres mal ;)) J'ai regardé un peu le code de la classe de spring, en fait il parcours toutes les URLs du classpath. Et on fait a peut pres la même chose dans nuiton-utils. Il serait assez simple de modifier nuiton-utils pour pouvoir utiliser n'importe quelle type de classloader. En gros aujourd'hui, on fait un: getUrls(), qui est dans URLClassLoader, alors qu'il faudrait faire un getResources() qui est sur ClassLoader. Ticket a ajouter a nuiton-utils :)
Y'a d'autres libs qui font ça dans commons je crois.
peut-etre dans http://commons.apache.org/vfs/ ? -- Benjamin POUSSIN -------------------- tél: +33 (0) 2 40 50 29 28 email: poussin@codelutin.com http://www.codelutin.com
Le 10/02/2011 12:12, Benjamin POUSSIN a écrit :
En gros aujourd'hui, on fait un: getUrls(), qui est dans URLClassLoader, alors qu'il faudrait faire un getResources() qui est sur ClassLoader. La tech en fait, c'est pour chercher "truc/machin/*.xml", il utilise getResources() sur "truc/machin" et sur les ressources trouvées, il liste le contenu (jar, zip, répertoire) et applique le pattern sur les fichiers trouvées.
Point intéressant par rapport à l'implémentation getURLs : - il ouvre les jar par flux (si possible) - il trouve toutes les occurrences (getURLs semble ne trouver que la première) C'est fait (pas encore commité) -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 28/04/2011 18:34, Eric Chatellier a écrit :
C'est fait (pas encore commité) Done.
Api : - Resource#getResources(String pattern) : List<URL> - Resource#getResources(String pattern, ClassLoader cl) : List<URL> -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
participants (3)
-
Benjamin POUSSIN -
chemit -
Eric Chatellier