Cara mendapatkan jalur direktori resource secara terprogram

90

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 ServletContextEventObject 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?

yamilmedina
sumber
Ada tiga varian solusi, bergantung pada situasinya: stackoverflow.com/a/56327069/715269
Gangnus

Jawaban:

70

Saya berasumsi bahwa konten src/main/resources/disalin ke WEB-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");
Dev
sumber
Terima kasih!! ini bekerja untuk saya, dengan URL itu maka saya membangun Path untuk File baru, dan akhirnya mendapatkan file di direktori itu.
yamilmedina
2
Anda tidak membutuhkan File. Anda sudah memiliki URL. Anda bahkan tidak dapat berasumsi bahwa ada file atau direktori sama sekali. WAR mungkin belum dibuka.
pengguna207421
Apa yang dimaksud MyServletContextListener di sini?
Tejesh Raut
@TejeshRaut Ini adalah placeholder untuk kelas yang mengimplementasikan javax.servlet.ServletContextListener. Saya menggunakan itu sebagai contoh karena pertanyaannya memiliki potongan contextInitialized yang merupakan metode yang ditentukan oleh ServletContextListenerantarmuka.
Dev
63

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;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();
yamilmedina
sumber
11
Apakah Anda yakin menggunakan "/sql"sebagai parameter? Saya memiliki masalah dengan garis miring awal, Alih-alih "sql"berfungsi.
Abdull
2
Perlu diketahui bahwa Anda bisa mendapatkan URL yang berbeda dengan this.getClass (). GetResource ("/ sql"));
ShadowGames
Ini tidak akan berfungsi di semua penampung. Tomcat, misalnya.
pengguna207421
16
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.

samlewis
sumber
7

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

grep
sumber
1
Apakah mereka juga mendukung mendapatkan sumber daya saat kode sedang dijalankan dari file jar?
Displee