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
?
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");
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();
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.
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