Saya memiliki tata letak direktori berikut:
- src
- utama
- Jawa
- sumber daya
- sql (skrip untuk database)
- musim semi (konfigurasi)
- aplikasi website
Dalam kelas ServletContextListener, saya ingin mengakses file di bawah direktori SQL dan mencantumkannya. Pada dasarnya masalah saya adalah dengan jalur, karena saya tahu bahwa daftar file di bawah direktori secara singkat adalah:
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
Mungkin aku bisa menggunakan ServletContextEvent
Object untuk mencoba dan membangun jalan menujuresources/sql
public void contextInitialized(ServletContextEvent event) {
event.getServletContext(); //(getRealPath etc.)
}
Apakah ada sesuatu untuk menyetel jalur itu dengan cara yang relatif, tanpa hardcode? Sesuatu seperti new File("classpath:sql")
(sebaiknya pegas jika memungkinkan) atau apa yang harus saya lakukan dengan servletContext untuk menunjuk resources/sql
?
Jawaban:
Saya berasumsi bahwa konten
src/main/resources/
disalin keWEB-INF/classes/
dalam .war Anda pada waktu pembuatan. Jika itu kasusnya, Anda dapat melakukannya (mengganti nilai nyata untuk nama kelas dan jalur yang dimuat).URL sqlScriptUrl = MyServletContextListener.class .getClassLoader().getResource("sql/script.sql");
sumber
javax.servlet.ServletContextListener
. Saya menggunakan itu sebagai contoh karena pertanyaannya memiliki potongancontextInitialized
yang merupakan metode yang ditentukan olehServletContextListener
antarmuka.Akhirnya, inilah yang saya lakukan:
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; } }
...
sumber
"/sql"
sebagai parameter? Saya memiliki masalah dengan garis miring awal, Alih-alih"sql"
berfungsi.import org.springframework.core.io.ClassPathResource; ... File folder = new ClassPathResource("sql").getFile(); File[] listOfFiles = folder.listFiles();
Perlu dicatat bahwa ini akan membatasi opsi penerapan Anda,
ClassPathResource.getFile()
hanya berfungsi jika penampung telah meledakkan (membuka zip) file perang Anda.sumber
Cukup gunakan kelas com.google.common.io.Resources . Contoh:
URL url = Resources.getResource("file name")
Setelah itu Anda memiliki metode seperti: .getContent (), .getFile (), .getPath () dll
sumber