Saran penggunaan terbatas, karena bergantung pada direktori kerja sebagai root maven. Dan meskipun demikian, Anda sebaiknya menggunakan target/classes/abc.txtuntuk mereferensikan file, karena ini adalah tempat kanonik tempat Maven meletakkan file resource setelah diproses (misalnya, plugin maven-resources mungkin telah melakukan substitusi properti di abc.txt). Jauh lebih baik menggunakan abc.txt melalui getResource () dari classpath.
Gyro Gearless
2
Bagaimana jika pengguna akhir menjalankan aplikasi Anda sebagai JAR yang dapat dijalankan? Maka tidak akan ada File fisik sama sekali. Ini adalah alasan lain mengapa Anda harus menggunakan getResource (), dan misalnya membuka aliran input padanya tergantung pada apa yang ingin Anda lakukan dengannya.
Matthew Wise
6
Bisakah ini dihapus sebagai jawaban yang benar? @Karol S menjawab di bawah ini - itu harus menjadi jawaban yang benar (karenanya perbedaan
suara positif
3
Jawaban yang salah. Silakan lihat jawaban di bawah ini oleh @Karol
Tidak masalah sekarang di mana file di classpath secara fisik berada, itu akan ditemukan selama sumber daya sebenarnya adalah file dan bukan entri JAR.
(Yang tampaknya jelas new File(resource.getPath())tidak berfungsi untuk semua jalur! Jalur tersebut masih dikodekan URL!)
Buat instance classLoader dari kelas yang Anda butuhkan, lalu Anda dapat mengakses file atau sumber daya dengan mudah. sekarang Anda mengakses jalur menggunakan getPath()metode kelas itu.
Ada dua masalah dalam perjalanan kita menuju jalan absolut:
Penempatan yang ditemukan bukan di tempat file sumber berada, tetapi di mana kelas disimpan. Dan folder sumber daya hampir pasti akan berada di suatu tempat di folder sumber proyek.
Fungsi yang sama untuk mengambil sumber daya berfungsi secara berbeda jika kelas dijalankan di plugin atau dalam paket langsung di ruang kerja.
Kode berikut akan memberi kita semua jalur yang berguna:
Di sini kedua fungsi yang dapat digunakan untuk pelokalan folder sumber daya diteliti. Adapun class, itu bisa didapat dengan cara apa pun, secara statis atau dinamis.
Jika proyek tidak ada di plugin, kode jika dijalankan di JUnit, akan mencetak:
Jadi, untuk masuk ke src / rest / resources kita harus naik dan turun pohon file. Kedua metode tersebut dapat digunakan. Perhatikan, kami tidak dapat menggunakan getResource(resourceFolderName), karena folder itu tidak ada di folder target. Tidak ada yang menempatkan sumber daya di folder yang dibuat, saya harap.
Jika kelas ada dalam paket yang ada di plugin, keluaran dari pengujian yang sama akan menjadi:
Di sini kita bisa mendapatkan jalur absolut hanya dengan menggabungkan hasil dari kedua fungsi tersebut. Dan itu tidak cukup. Di antara mereka, kita harus meletakkan jalur lokal tempat paket kelas berada, secara relatif ke folder plugin. Mungkin, Anda harus memasukkan sesuatu sebagai srcatau di src/test/resourcesini.
Anda dapat memasukkan kode ke milik Anda dan melihat jalur yang Anda miliki.
Jawaban:
Anda dapat menggunakan
ClassLoader.getResource
metode untuk mendapatkan sumber daya yang benar.URL res = getClass().getClassLoader().getResource("abc.txt"); File file = Paths.get(res.toURI()).toFile(); String absolutePath = file.getAbsolutePath();
ATAU
Meskipun ini mungkin tidak selalu berhasil, solusi yang lebih sederhana -
Anda dapat membuat
File
objek dan menggunakangetAbsolutePath
metode:File file = new File("resources/abc.txt"); String absolutePath = file.getAbsolutePath();
sumber
target/classes/abc.txt
untuk mereferensikan file, karena ini adalah tempat kanonik tempat Maven meletakkan file resource setelah diproses (misalnya, plugin maven-resources mungkin telah melakukan substitusi properti di abc.txt). Jauh lebih baik menggunakan abc.txt melalui getResource () dari classpath.Cara yang benar yang benar-benar berhasil:
URL resource = YourClass.class.getResource("abc"); Paths.get(resource.toURI()).toFile();
Tidak masalah sekarang di mana file di classpath secara fisik berada, itu akan ditemukan selama sumber daya sebenarnya adalah file dan bukan entri JAR.
(Yang tampaknya jelas
new File(resource.getPath())
tidak berfungsi untuk semua jalur! Jalur tersebut masih dikodekan URL!)sumber
new File(resource.toURI()).getAbsolutePath();
(yaitu saya tidak berpikir Anda membutuhkan objek Path?)new File(YourClass.class.getResource("abc").toURI().getPath())
jika Anda mau..getResource("/abc")
Anda perlu menentukan jalur mulai dari
/
URL resource = YourClass.class.getResource("/abc"); Paths.get(resource.toURI()).toFile();
sumber
Buat instance classLoader dari kelas yang Anda butuhkan, lalu Anda dapat mengakses file atau sumber daya dengan mudah. sekarang Anda mengakses jalur menggunakan
getPath()
metode kelas itu.ClassLoader classLoader = getClass().getClassLoader(); String path = classLoader.getResource("chromedriver.exe").getPath(); System.out.println(path);
sumber
Untuk mengembalikan file atau jalur file
URL resource = YourClass.class.getResource("abc"); File file = Paths.get(resource.toURI()).toFile(); // return a file String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path
sumber
Ada dua masalah dalam perjalanan kita menuju jalan absolut:
Kode berikut akan memberi kita semua jalur yang berguna:
URL localPackage = this.getClass().getResource(""); URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation(); String localDir = localPackage.getPath(); String loaderDir = urlLoader.getPath(); System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);
Di sini kedua fungsi yang dapat digunakan untuk pelokalan folder sumber daya diteliti. Adapun
class
, itu bisa didapat dengan cara apa pun, secara statis atau dinamis.Jika proyek tidak ada di plugin, kode jika dijalankan di JUnit, akan mencetak:
loaderDir = /C:.../ws/source.dir/target/test-classes/ localDir = /C:.../ws/source.dir/target/test-classes/package/
Jadi, untuk masuk ke src / rest / resources kita harus naik dan turun pohon file. Kedua metode tersebut dapat digunakan. Perhatikan, kami tidak dapat menggunakan
getResource(resourceFolderName)
, karena folder itu tidak ada di folder target. Tidak ada yang menempatkan sumber daya di folder yang dibuat, saya harap.Jika kelas ada dalam paket yang ada di plugin, keluaran dari pengujian yang sama akan menjadi:
loaderDir = /C:.../ws/plugin/bin/ localDir = /C:.../ws/plugin/bin/package/
Jadi, sekali lagi kita harus naik dan turun pohon folder.
Yang paling menarik adalah kasus ketika paket diluncurkan di plugin. Sebagai pengujian plugin JUnit, untuk contoh kami. Outputnya adalah:
loaderDir = /C:.../ws/plugin/ localDir = /package/
Di sini kita bisa mendapatkan jalur absolut hanya dengan menggabungkan hasil dari kedua fungsi tersebut. Dan itu tidak cukup. Di antara mereka, kita harus meletakkan jalur lokal tempat paket kelas berada, secara relatif ke folder plugin. Mungkin, Anda harus memasukkan sesuatu sebagai
src
atau disrc/test/resource
sini.Anda dapat memasukkan kode ke milik Anda dan melihat jalur yang Anda miliki.
sumber