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 ServletContextEventObjeto 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 delcontextInitializedcual es un método definido por laServletContextListenerinterfaz.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