Tenho o seguinte layout de diretório:
- src
- a Principal
- Java
- Recursos
- sql (scripts para banco de dados)
- mola (configuração)
- aplicativo web
Em uma classe ServletContextListener, desejo acessar os arquivos no diretório SQL e listá-los. Basicamente, meu problema é com o caminho, porque sei que listar arquivos em um diretório em poucas palavras é:
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
Talvez eu pudesse usar o ServletContextEvent
objeto para tentar construir um caminho pararesources/sql
public void contextInitialized(ServletContextEvent event) {
event.getServletContext(); //(getRealPath etc.)
}
Existe algo para definir esse caminho de maneira relativa e não codificada? Algo como new File("classpath:sql")
(de preferência spring, se possível) ou o que devo fazer com o servletContext para apontar resources/sql
?
Respostas:
Estou assumindo que o conteúdo de
src/main/resources/
é copiado paraWEB-INF/classes/
dentro de seu .war no momento da construção. Se for esse o caso, você pode apenas fazer (substituindo por valores reais o nome da classe e o caminho que está sendo carregado).URL sqlScriptUrl = MyServletContextListener.class .getClassLoader().getResource("sql/script.sql");
fonte
javax.servlet.ServletContextListener
. Usei isso como exemplo porque a questão tinha um trecho docontextInitialized
qual é um método definido pelaServletContextListener
interface.Finalmente, foi isso que eu fiz:
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; } }
...
fonte
"/sql"
como parâmetro? Tenho problemas com uma barra inicial, mas"sql"
funciona.import org.springframework.core.io.ClassPathResource; ... File folder = new ClassPathResource("sql").getFile(); File[] listOfFiles = folder.listFiles();
É importante notar que isso limitará suas opções de implantação,
ClassPathResource.getFile()
só funciona se o contêiner explodiu (descompactou) seu arquivo war.fonte
Basta usar a classe com.google.common.io.Resources . Exemplo:
URL url = Resources.getResource("file name")
Depois disso, você tem métodos como: .getContent (), .getFile (), .getPath () etc
fonte