Saya mencoba untuk mendapatkan jalan ke Sumber Daya tetapi saya tidak beruntung.
Ini berfungsi (baik dalam IDE dan dengan JAR) tetapi dengan cara ini saya tidak bisa mendapatkan path ke file, hanya isi file:
ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));
Jika saya melakukan ini:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());
Hasilnya adalah:
java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
Apakah ada cara untuk mendapatkan path ke file sumber daya?
Jawaban:
Ini disengaja. Konten "file" mungkin tidak tersedia sebagai file. Ingat Anda berurusan dengan kelas dan sumber daya yang mungkin merupakan bagian dari file JAR atau jenis sumber daya lainnya. Classloader tidak harus menyediakan pegangan file ke sumber daya, misalnya file jar mungkin tidak diperluas ke file individual di sistem file.
Apa pun yang dapat Anda lakukan dengan mendapatkan java.io.File dapat dilakukan dengan menyalin aliran ke file sementara dan melakukan hal yang sama, jika java.io.File benar-benar diperlukan.
sumber
Saat memuat sumber daya, pastikan Anda memperhatikan perbedaan antara:
dan
Saya kira, kebingungan ini menyebabkan sebagian besar masalah saat memuat sumber daya.
Selain itu, saat Anda memuat gambar, lebih mudah digunakan
getResourceAsStream()
:Ketika Anda benar-benar harus memuat file (non-gambar) dari arsip JAR, Anda dapat mencoba ini:
sumber
bin
folder dan pergi ke direktori pemuatan kelas di sumber daya sebelum menggunakan jalur `/com/myorg/filename.ext '.Jawaban satu baris adalah -
Pada dasarnya
getResource
metode memberikan URL. Dari URL ini Anda dapat mengekstrak jalur dengan menelepontoExternalForm()
Referensi:
getResource () , toExternalForm ()
sumber
file:/
path, yang bekerja di jar tetapi tidak di IDESaya menghabiskan waktu dengan bermain-main dengan masalah ini, karena tidak ada solusi yang saya temukan benar-benar berhasil, anehnya! Direktori kerja sering kali bukan direktori JAR, terutama jika JAR (atau program apa pun) dijalankan dari Start Menu di bawah Windows. Jadi di sini adalah apa yang saya lakukan, dan itu berfungsi untuk file .class dijalankan dari luar JAR sama seperti itu bekerja untuk JAR. (Saya hanya mengujinya di Windows 7.)
sumber
jika
netclient.p
ada di dalam file JAR, itu tidak akan memiliki jalur karena file itu terletak di dalam file lain. dalam hal itu, jalan terbaik yang dapat Anda miliki adalah benar-benarfile:/path/to/jarfile/bot.jar!/config/netclient.p
.sumber
Anda perlu memahami jalur di dalam file jar.
Cukup merujuknya secara relatif. Jadi jika Anda memiliki file (myfile.txt), terletak di foo.jar di bawah
\src\main\resources
direktori (maven style). Anda akan menyebutnya seperti:Jika Anda membuang tabung
jar -tvf myjar.jar
Anda menggunakan Anda akan melihat output dan jalur relatif di dalam file jar, dan menggunakan FORWARD SLASHES.sumber
File.separator
.Dalam kasus saya, saya menggunakan objek URL, bukan Path.
Mengajukan
Sumber daya di classpath menggunakan classloader
Ketika saya perlu membaca konten, saya dapat menggunakan kode berikut:
Dan Anda dapat mengakses konten menggunakan InputStream.
sumber
Ini adalah kode yang sama dari pengguna Tombart dengan aliran rata dan dekat untuk menghindari salinan konten file temporer yang tidak lengkap dari sumber jar dan memiliki nama file temp yang unik.
sumber
File adalah abstraksi untuk file dalam sistem file, dan sistem file tidak tahu apa-apa tentang apa isi dari JAR.
Coba dengan URI, saya pikir ada toples: // protokol yang mungkin berguna untuk tujuan Anda.
sumber
Jalur berikut berhasil bagi saya:
classpath:/path/to/resource/in/jar
sumber
Mendapatkan ini dari
getSystemResourceAsStream
adalah pilihan terbaik. Dengan mendapatkan inputstream daripada file atau URL, bekerja di file JAR dan berdiri sendiri.sumber
Mungkin agak terlambat tetapi Anda dapat menggunakan perpustakaan saya KResourceLoader untuk mendapatkan sumber daya dari toples Anda:
sumber
Ketika berada di file jar, sumber daya tersebut berada di hierarki paket (bukan hierarki sistem file). Jadi, jika Anda memiliki kelas com.example.Sweet memuat sumber daya bernama "./default.conf" maka nama sumber daya tersebut ditentukan sebagai "/com/example/default.conf".
Tetapi jika itu dalam toples maka itu bukan File ...
sumber
Di dalam folder sumber daya Anda (java / utama / sumber daya) dari jar Anda tambahkan file Anda (kami menganggap bahwa Anda telah menambahkan file xml bernama import.xml ), setelah itu Anda menyuntikkan
ResourceLoader
jika Anda menggunakan pegas seperti di bawah inifungsi tur dalam menulis kode di bawah ini untuk memuat file:
sumber
Mungkin metode ini dapat digunakan untuk solusi cepat.
sumber
java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.CodeSource java.security.ProtectionDomain.getCodeSource()' on a null object reference
ikuti kode!
/ src / main / resources / file
sumber