Tengo el siguiente diseño de directorio:
- src
- principal
- Java
- recursos
- sql (scripts para base de datos)
- primavera (configuración)
- Aplicación Web
Dentro de una clase ServletContextListener, quiero acceder a los archivos del directorio SQL y enumerarlos. Básicamente, mi problema es con la ruta, porque sé que enumerar archivos en un directorio en pocas palabras es:
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
Quizás podría usar el ServletContextEvent
Objeto para intentar construir una ruta haciaresources/sql
public void contextInitialized(ServletContextEvent event) {
event.getServletContext(); //(getRealPath etc.)
}
¿Existe algo para establecer ese camino de una manera relativa, no codificada? Algo como new File("classpath:sql")
(preferiblemente primavera si es posible) o ¿qué debo hacer con el servletContext al que apuntar resources/sql
?
Respuestas:
Supongo que el contenido de
src/main/resources/
se copiaWEB-INF/classes/
dentro de su .war en el momento de la compilación. Si ese es el caso, puede hacerlo (sustituyendo los valores reales por el nombre de la clase y la ruta que se está cargando).URL sqlScriptUrl = MyServletContextListener.class .getClassLoader().getResource("sql/script.sql");
fuente
javax.servlet.ServletContextListener
. Lo usé como ejemplo porque la pregunta tenía un fragmento delcontextInitialized
cual es un método definido por laServletContextListener
interfaz.Finalmente, esto es lo que hice:
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; } }
...
fuente
"/sql"
como parámetro? Tengo problemas con una barra inicial, pero"sql"
funciona.import org.springframework.core.io.ClassPathResource; ... File folder = new ClassPathResource("sql").getFile(); File[] listOfFiles = folder.listFiles();
Vale la pena señalar que esto limitará sus opciones de implementación,
ClassPathResource.getFile()
solo funciona si el contenedor ha explotado (descomprimido) su archivo war.fuente
Simplemente use la clase com.google.common.io.Resources . Ejemplo:
URL url = Resources.getResource("file name")
Después de eso, tiene métodos como: .getContent (), .getFile (), .getPath (), etc.
fuente