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?


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");

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();

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.


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


1
Apakah mereka juga mendukung mendapatkan sumber daya saat kode sedang dijalankan dari file jar?
Displee
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.