web-dev-qa-db-fra.com

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

J'ai la disposition de répertoire suivante:

  • src
    • principale
      • Java
      • ressources
        • sql (scripts pour base de données)
        • printemps (configuration)
      • webapp

Dans une classe ServletContextListener, je souhaite accéder aux fichiers du répertoire SQL et les répertorier. Fondamentalement, mon problème est lié au chemin, car je sais que lister des fichiers dans un répertoire est bref:

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

Peut-être que je pourrais utiliser l’objet ServletContextEvent pour essayer de créer un chemin vers resources/sql

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

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

55
whyem

Je suppose que le contenu de src/main/resources/ est copié dans WEB-INF/classes/ dans votre fichier .war au moment de la compilation. 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");
45
Dev

Enfin c'est 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();
44
whyem
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.

12
samlewis

Utilisez simplement com.google.common.io.Resources class. Exemple:

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

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

0
grep