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?


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");

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();

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.


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.


1
Prennent-ils également en charge l'obtention de ressources pendant l'exécution du code à partir d'un fichier jar?
Displee
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.