Comment obtenir le chemin du répertoire des ressources par programme

86

J'ai la disposition de répertoire suivante:

  • src
    • principale
      • Java
      • Ressources
        • sql (scripts pour la base de données)
        • ressort (configuration)
      • webapp

Dans une classe ServletContextListener, je souhaite accéder aux fichiers du répertoire SQL et les lister. Fondamentalement, mon problème est avec le chemin, car je sais que répertorier les fichiers sous un répertoire en un mot est:

File folder = new File(path);
File[] listOfFiles = folder.listFiles();

Peut-être que je pourrais utiliser l' ServletContextEventobjet pour essayer de créer un chemin versresources/sql

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}

Existe-t-il quelque chose pour définir ce chemin de manière relative et non codée en dur? Quelque chose comme new File("classpath:sql")(de préférence ressort si possible) ou que dois-je faire avec le servletContext vers lequel pointer resources/sql?

yamilmedina
la source
Il existe trois variantes de solution, selon la situation: stackoverflow.com/a/56327069/715269
Gangnus

Réponses:

69

Je suppose que le contenu de src/main/resources/est copié WEB-INF/classes/dans votre .war au moment de la construction. Si tel est le cas, vous pouvez simplement le faire (en substituant des valeurs réelles au nom de la classe et au chemin en cours de chargement).

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");
Dev
la source
Merci!! cela a fonctionné pour moi, avec cette URL, je construis le chemin pour le nouveau fichier et j'obtiens enfin les fichiers dans ce répertoire.
yamilmedina
2
Vous n'avez pas besoin du fichier. Vous avez déjà une URL. Vous ne pouvez même pas supposer qu'il existe un fichier ou un répertoire. Le WAR n'a peut-être pas été déballé.
Marquis de Lorne
Que signifie MyServletContextListener ici?
Tejesh Raut
@TejeshRaut C'est un espace réservé pour une classe qui implémente javax.servlet.ServletContextListener. J'ai utilisé cela comme exemple car la question avait un extrait de code à partir contextInitialized duquel est une méthode définie par l' ServletContextListenerinterface.
Dev
60

Enfin, voici ce que j'ai fait:

private File getFileFromURL() {
    URL url = this.getClass().getClassLoader().getResource("/sql");
    File file = null;
    try {
        file = new File(url.toURI());
    } catch (URISyntaxException e) {
        file = new File(url.getPath());
    } finally {
        return file;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();
yamilmedina
la source
11
Êtes-vous sûr de l'utiliser "/sql"comme paramètre? J'ai des problèmes avec une barre oblique de départ, au lieu de cela "sql"fonctionne.
Abdull
2
Veuillez noter que vous pouvez obtenir une URL différente avec this.getClass (). GetResource ("/ sql"));
ShadowGames
Cela ne fonctionnera pas sur tous les conteneurs. Tomcat, par exemple.
Marquis of Lorne le
16
import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();

Il est à noter que cela limitera vos options de déploiement, ClassPathResource.getFile()ne fonctionne que si le conteneur a explosé (décompressé) votre fichier war.

samlewis
la source
6

Utilisez simplement la classe com.google.common.io.Resources . Exemple:

 URL url = Resources.getResource("file name")

Après cela, vous avez des méthodes comme: .getContent (), .getFile (), .getPath () etc.

grep
la source
1
Prennent-ils également en charge l'obtention de ressources pendant l'exécution du code à partir d'un fichier jar?
Displee