Asumsikan pengaturan maven standar.
Katakanlah di folder resource Anda, Anda memiliki file abc
.
Di Java, bagaimana saya bisa mendapatkan path absolut ke file tersebut?
Asumsikan pengaturan maven standar.
Katakanlah di folder resource Anda, Anda memiliki file abc
.
Di Java, bagaimana saya bisa mendapatkan path absolut ke file tersebut?
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 menggunakan getAbsolutePath
metode:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
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!)
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")
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);
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
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 di src/test/resource
sini.
Anda dapat memasukkan kode ke milik Anda dan melihat jalur yang Anda miliki.