92 votes

Comment utiliser ClassLoader.getResources () correctement?

Comment puis-je utiliser ClassLoader.getResources() trouver recursivly ressources de mon classpath?

E. g.

  • trouver toutes les ressources dans l' META-INF"répertoire": Imaginez quelque chose comme

    getClass().getClassLoader().getResources("META-INF")

    Malheureusement, cela ne fait que récupérer une URL exactement ce "répertoire".

  • toutes les ressources nommées bla.xml (recursivly)

    getClass().getClassLoader().getResources("bla.xml")

    Mais il renvoie un vide Enumeration.

Et une question bonus: Comment est - ClassLoader.getResources() diffèrent ClassLoader.getResource()?

43voto

rec Points 1936

Le framework Spring a une classe qui permet de rechercher récursivement dans le classpath:

 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");
 

25voto

krock Points 13537

Il n'y a pas de façon récursive de recherche à travers le chemin de la classe. Vous avez besoin de connaître le chemin d'accès Complet d'une ressource pour être en mesure de récupérer de cette façon. La ressource peut être dans un répertoire dans le système de fichiers ou dans un fichier jar, de sorte qu'il n'est pas aussi simple qu'une liste de répertoire de "le chemin". Vous aurez besoin de fournir le chemin d'accès complet de la ressource, par exemple '/com/mypath/bla.xml'.

Pour votre deuxième question, getResource sera de retour la première ressource qui correspond le nom de la ressource. L'ordre que le chemin de classe est recherché est donné dans la javadoc de getResource.

22voto

Tomas Narros Points 7280

C'est le plus simple wat pour obtenir le Fichier objet pour lequel une certaine URL objet pointe vers:

File file=new File(url.toURI());

Maintenant, pour vos questions concrètes:

  • trouver toutes les ressources dans le META-INF "répertoire":

Vous pouvez en effet obtenir l'objet de Fichier pointant vers cette URL

Enumeration<URL> en=getClass().getClassLoader().getResources("META-INF");
if (en.hasMoreElements()) {
    URL metaInf=en.nextElement();
    File fileMetaInf=new File(metaInf.toURI());

    File[] files=fileMetaInf.listFiles();
    //or 
    String[] filenames=fileMetaInf.list();
}
  • toutes les ressources nommé bla.xml (recursivly)

Dans ce cas, vous devrez faire de code personnalisé. Voici un mannequin exemple:

final List<File> foundFiles=new ArrayList<File>();

FileFilter customFilter=new FileFilter() {
    @Override
    public boolean accept(File pathname) {

        if(pathname.isDirectory()) {
            pathname.listFiles(this);
        }
        if(pathname.getName().endsWith("bla.xml")) {
            foundFiles.add(pathname);
            return true;
        }
        return false;
    }

};      
//rootFolder here represents a File Object pointing the root forlder of your search 
rootFolder.listFiles(customFilter);

Lorsque le code est exécuté, vous obtiendrez toutes les trouvé ocurrences à l' foundFiles de la Liste.

12voto

Mark Butler Points 1463

Voici le code basé sur la réponse de bestsss:

     Enumeration<URL> en = getClass().getClassLoader().getResources(
            "META-INF");
    List<String> profiles = new ArrayList<>();
    if (en.hasMoreElements()) {
        URL url = en.nextElement();
        JarURLConnection urlcon = (JarURLConnection) (url.openConnection());
        try (JarFile jar = urlcon.getJarFile();) {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                String entry = entries.nextElement().getName();
                System.out.println(entry);
            }
        }
    }
 

5voto

bestsss Points 6403

MRalwasser, je vous donnerais un indice, lancez les URL.getConnection() à JarURLConnection . Ensuite, utilisez JarURLConnection.getJarFile () et le tour est joué! Vous avez le JarFile et vous êtes libre d'accéder aux ressources à l'intérieur.

Le reste je vous laisse.

J'espère que cela t'aides!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X