Kode saya berjalan di dalam file JAR, katakan foo.jar , dan saya perlu tahu, dalam kode tersebut, di folder mana foo.jar berjalan .
Jadi, jika foo.jar ada di dalamnyaC:\FOO\
, saya ingin mendapatkan jalur itu, apa pun direktori kerja saya saat ini.
java
path
jar
executable-jar
Thiago Chaves
sumber
sumber
Jawaban:
Ganti "MyClass" dengan nama kelas Anda.
Jelas, ini akan melakukan hal-hal aneh jika kelas Anda diambil dari lokasi non-file.
sumber
toURI()
Langkah penting untuk masalah menghindari dengan karakter khusus, termasuk spasi dan plus. Satu kalimat yang benar adalah:return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());
MenggunakanURLDecoder
tidak berfungsi untuk banyak karakter khusus. Lihat jawaban saya di bawah untuk perincian lebih lanjut.getProtectionDomain
adalah nol jika Anda mendapatkan kelas Anda dari stracktrace:val strace = Thread.currentThread().getStackTrace; val path = strace(1).getClass.getProtectionDomain
Solusi terbaik untuk saya:
Ini harus menyelesaikan masalah dengan spasi dan karakter khusus.
sumber
URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");
) di Linux. Namun, saya tidak mencoba di Windows.URLDecoder
untuk memecahkan kode karakter khusus. Khususnya, karakter seperti+
akan didekodekan secara keliru ke spasi. Lihat jawaban saya untuk detailnya.Untuk mendapatkan
File
untuk diberikanClass
, ada dua langkah:Class
ke aURL
URL
ke aFile
Penting untuk memahami kedua langkah, dan tidak mengacaukannya.
Setelah Anda memiliki
File
, Anda dapat menelepongetParentFile
untuk mendapatkan folder yang berisi, jika itu yang Anda butuhkan.Langkah 1:
Class
keURL
Seperti dibahas dalam jawaban lain, ada dua cara utama untuk menemukan yang
URL
relevan dengan aClass
.URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();
URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");
Keduanya memiliki pro dan kontra.
The
getProtectionDomain
Pendekatan menghasilkan lokasi dasar kelas (misalnya, berisi file JAR). Namun, ada kemungkinan bahwa kebijakan keamanan Java runtime akan dilemparkanSecurityException
saat memanggilgetProtectionDomain()
, jadi jika aplikasi Anda perlu dijalankan di berbagai lingkungan, yang terbaik adalah mengujinya di semua lingkungan tersebut.The
getResource
Pendekatan menghasilkan path sumber daya URL lengkap dari kelas, dari mana Anda akan perlu melakukan tambahan manipulasi string. Ini mungkinfile:
jalan, tetapi juga bisajar:file:
atau bahkan sesuatu yang lebih buruk sepertibundleresource://346.fwk2106232034:4/foo/Bar.class
ketika mengeksekusi dalam kerangka OSGi. Sebaliknya,getProtectionDomain
pendekatan menghasilkanfile:
URL dengan benar bahkan dari dalam OSGi.Perhatikan bahwa keduanya
getResource("")
dangetResource(".")
gagal dalam pengujian saya, ketika kelas berada dalam file JAR; kedua doa dikembalikan nol. Jadi saya merekomendasikan doa # 2 yang ditunjukkan di atas sebagai gantinya, karena tampaknya lebih aman.Langkah 2:
URL
keFile
Either way, setelah Anda memiliki
URL
, langkah selanjutnya adalah mengonversi ke aFile
. Ini adalah tantangannya sendiri; lihat posting blog Kohsuke Kawaguchi tentang hal itu untuk detail lengkap, tetapi singkatnya, Anda dapat menggunakannew File(url.toURI())
selama URL benar-benar terbentuk dengan baik.Terakhir, saya akan sangat tidak suka menggunakan
URLDecoder
. Beberapa karakter URL,:
dan/
khususnya, bukan karakter yang disandikan dengan URL. Dari URLDecoder Javadoc:Dalam praktiknya,
URLDecoder
umumnya tidak melemparIllegalArgumentException
seperti terancam di atas. Dan jika path file Anda memiliki ruang yang disandikan%20
, pendekatan ini mungkin berfungsi. Namun, jika jalur file Anda memiliki karakter non-alfamerik lain seperti+
Anda akan mengalami masalah denganURLDecoder
mengatur jalur file Anda.Kode kerja
Untuk mencapai langkah-langkah ini, Anda mungkin memiliki metode seperti berikut:
Anda dapat menemukan metode ini di perpustakaan umum SciJava :
sumber
Anda juga bisa menggunakan:
sumber
Gunakan ClassLoader.getResource () untuk menemukan URL untuk kelas Anda saat ini.
Sebagai contoh:
(Contoh ini diambil dari pertanyaan serupa .)
Untuk menemukan direktori, Anda harus membongkar URL secara manual. Lihat tutorial JarClassLoader untuk format URL jar.
sumber
NPE
karena Anda tidak menjawab pertanyaan yang diajukan (jalur ke JAR dir ditanya dan Anda menjawab pertanyaan yang sangat berbeda: jalur ke kelas). 2. Seperti yang ditunjukkan oleh orang lain, dan saya mendapatkan masalah yang sama, itu tidak berfungsi untuk applet. 3. jalan Returned tidak representasi jalan kanonik sama sekali:jar:file:/listener/build/libs/listener-1.0.0-all.jar!/shared/Test.class
.Saya terkejut melihat bahwa tidak ada yang baru-baru ini diusulkan untuk digunakan
Path
. Berikut berikut kutipan: " ThePath
class meliputi berbagai metode yang dapat digunakan untuk memperoleh informasi tentang jalan, elemen akses jalan, mengkonversi jalan untuk bentuk lain, atau ekstrak bagian dari jalan "Dengan demikian, alternatif yang baik adalah dengan
Path
mengajukan keberatan sebagai:sumber
Satu-satunya solusi yang berfungsi untuk saya di Linux, Mac dan Windows:
sumber
Saya memiliki masalah yang sama dan saya menyelesaikannya dengan cara itu:
Saya harap saya bisa membantu Anda.
sumber
Berikut ini peningkatan ke komentar lain, yang menurut saya tidak lengkap untuk spesifik
sumber
URLDecoder
untuk memecahkan kode karakter khusus. Khususnya, karakter seperti+
akan didekodekan secara keliru ke spasi. Lihat jawaban saya untuk detailnya.URLDecoder
, terlepas dari namanya, adalah untuk mendekode URL dan membentuk nama dan nilai parameter, bukan URL.Untuk mendapatkan jalur menjalankan file jar saya telah mempelajari solusi di atas dan mencoba semua metode yang ada perbedaan satu sama lain. Jika kode ini berjalan di Eclipse IDE, mereka semua harus dapat menemukan path file termasuk kelas yang ditunjukkan dan membuka atau membuat file yang ditunjukkan dengan path yang ditemukan.
Tapi itu rumit, ketika menjalankan file jar runnable secara langsung atau melalui baris perintah, itu akan gagal karena path file jar didapat dari metode di atas akan memberikan jalur internal dalam file jar, yang selalu memberikan path sebagai
rsrc: project-name (mungkin saya harus mengatakan bahwa itu adalah nama paket dari file kelas utama - kelas yang ditunjukkan)
Saya tidak dapat mengonversi jalur rsrc: ... ke jalur eksternal, yaitu saat menjalankan file jar di luar Eclipse IDE, ia tidak dapat memperoleh jalur file jar.
Satu-satunya cara yang mungkin untuk mendapatkan jalur menjalankan file jar di luar Eclipse IDE adalah
baris kode ini dapat mengembalikan path hidup (termasuk nama file) dari file jar yang sedang berjalan (perhatikan bahwa path kembali bukan direktori kerja), seperti dokumen java dan beberapa orang mengatakan bahwa itu akan mengembalikan path semua file kelas di direktori yang sama, tetapi sebagai pengujian saya jika dalam direktori yang sama menyertakan banyak file jar, itu hanya mengembalikan jalur menjalankan jar (tentang masalah beberapa jalur memang itu terjadi di Eclipse).
sumber
java.class.path
dapat multinilai. Satu nilai-nilai itu tentu akan memberikan direktori atau file JAR di mana kelas saat ini berada, tetapi yang mana?Jawaban lain tampaknya mengarah ke sumber kode yang merupakan lokasi file Jar yang bukan direktori.
Menggunakan
sumber
jawaban yang dipilih di atas tidak berfungsi jika Anda menjalankan tabung Anda dengan mengkliknya dari lingkungan desktop Gnome (bukan dari skrip atau terminal apa pun).
Sebaliknya, saya suka bahwa solusi berikut ini bekerja di mana-mana:
sumber
URLDecoder
untuk memecahkan kode karakter khusus. Khususnya, karakter seperti+
akan didekodekan secara keliru ke spasi. Lihat jawaban saya untuk detailnya.NullPointerException
NPE
jika tidak ada sumber daya di JAR.Sebenarnya ini adalah versi yang lebih baik - yang lama gagal jika nama folder memiliki ruang di dalamnya.
Sedangkan untuk gagal dengan applet, Anda biasanya tidak akan memiliki akses ke file lokal. Saya tidak tahu banyak tentang JWS tetapi untuk menangani file lokal mungkin tidak mungkin untuk mengunduh aplikasi.?
sumber
Saya mencoba untuk mendapatkan jalur menjalankan jar menggunakan
c: \ app> java -jar application.jar
Menjalankan aplikasi jar bernama "application.jar", pada Windows di folder " c: \ app ", nilai variabel "folder" String adalah " \ c: \ app \ application.jar " dan saya mengalami masalah pengujian untuk kebenaran jalan
Jadi saya mencoba mendefinisikan "tes" sebagai:
untuk mendapatkan path dalam format yang tepat seperti " c: \ app ", bukan " \ c: \ app \ application.jar " dan saya perhatikan bahwa itu berfungsi.
sumber
Solusi paling sederhana adalah dengan melewatkan jalur sebagai argumen saat menjalankan toples.
Anda dapat mengotomatiskan ini dengan skrip shell (.bat di Windows, .sh di tempat lain):
Saya biasa
.
melewati direktori kerja saat ini.MEMPERBARUI
Anda mungkin ingin menempel file jar di sub-direktori sehingga pengguna tidak sengaja mengkliknya. Kode Anda juga harus memeriksa untuk memastikan bahwa argumen baris perintah telah disediakan, dan memberikan pesan kesalahan yang baik jika argumen tersebut hilang.
sumber
Saya harus banyak dipusingkan sebelum akhirnya menemukan solusi yang berfungsi (dan singkat).
Ada kemungkinan bahwa
jarLocation
disertai dengan awalan sepertifile:\
ataujar:file\
, yang dapat dihapus dengan menggunakanString#substring()
.sumber
Path selalu merujuk ke sumber daya dalam file jar.
sumber
String path = new File(getClass().getResource("").getPath()).getParentFile().getParent(); File jarDir = new File(path.substring(5));
getResource("")
dangetResource(".")
gagal dalam pengujian saya, ketika kelas berada dalam file JAR; kedua doa dikembalikan nol.NullPointerException
.Berfungsi baik di Windows
sumber
Sesuatu yang membuat frustrasi adalah ketika Anda berkembang di Eclipse
MyClass.class.getProtectionDomain().getCodeSource().getLocation()
mengembalikan/bin
direktori yang bagus, tetapi ketika Anda mengkompilasinya ke jar, path menyertakan/myjarname.jar
bagian yang memberi Anda nama file ilegal.Agar kode berfungsi baik dalam ide dan setelah dikompilasi ke stoples, saya menggunakan potongan kode berikut:
sumber
Tidak benar-benar yakin tentang yang lain tetapi dalam kasus saya itu tidak bekerja dengan "jar Runnable" dan saya membuatnya bekerja dengan memperbaiki kode bersama-sama dari jawaban phchen2 dan yang lain dari tautan ini: Bagaimana cara mendapatkan jalur file JAR yang berjalan? Kode:
sumber
Telah mencoba beberapa solusi di sana tetapi tidak ada yang menghasilkan hasil yang benar untuk kasus (mungkin khusus) bahwa jar runnable telah diekspor dengan "Kemasan perpustakaan eksternal" di Eclipse. Untuk beberapa alasan semua solusi yang didasarkan pada ProtectionDomain menghasilkan null dalam kasus itu.
Dari menggabungkan beberapa solusi di atas saya berhasil mencapai kode kerja berikut:
sumber
Coba ini:
sumber
Metode ini, dipanggil dari kode dalam arsip, mengembalikan folder tempat file .jar berada. Ini harus bekerja di Windows atau Unix.
Berasal dari kode di: Menentukan apakah menjalankan dari JAR
sumber
Sebutkan bahwa itu hanya dicek
Windows
tetapi saya pikir ini berfungsi sempurna pada Sistem Operasi lain [Linux,MacOs,Solaris
] :).Saya memiliki 2
.jar
file di direktori yang sama. Saya ingin dari satu.jar
file untuk memulai.jar
file lain yang ada di direktori yang sama.Masalahnya adalah ketika Anda memulainya dari
cmd
direktori saat inisystem32
.;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
atau()%&$%^@#
berfungsi dengan baik.ProcessBuilder
dengan di bawah ini sebagai berikut:🍂 ..
🍂
getBasePathForClass(Class<?> classs)
:sumber
Kode ini berfungsi untuk saya:
sumber
Kode ini berfungsi bagi saya untuk mengidentifikasi apakah program sedang dijalankan di dalam file JAR atau IDE:
Jika saya perlu mendapatkan path Windows penuh file JAR saya menggunakan metode ini:
Kode lengkap saya bekerja dengan aplikasi Spring Boot menggunakan
CommandLineRunner
implementasi, untuk memastikan bahwa aplikasi selalu dieksekusi dalam tampilan konsol (Klik ganda karena kesalahan dalam nama file JAR), saya menggunakan kode berikut:sumber
Saya menulis di Java 7, dan menguji di Windows 7 dengan runtime Oracle, dan Ubuntu dengan runtime open source. Ini berfungsi sempurna untuk sistem itu:
Path untuk direktori induk dari setiap file jar yang sedang berjalan (dengan asumsi kelas yang memanggil kode ini adalah anak langsung dari arsip jar itu sendiri):
Jadi, jalan foo.jar adalah:
Sekali lagi, ini tidak diuji pada Mac atau Windows yang lebih lama
sumber
The
getProtectionDomain
Pendekatan mungkin tidak bekerja kadang-kadang misalnya ketika Anda harus menemukan jar untuk beberapa kelas java inti (misalnya dalam kasus sayaStringBuilder
kelas dalam IBM JDK), karya namun berikut mulus:sumber
Saya punya cara lain untuk mendapatkan lokasi String dari sebuah kelas.
String keluaran akan memiliki bentuk
Spasi dan karakter lain ditangani, dan dalam bentuk tanpa
file:/
. Jadi akan lebih mudah digunakan.sumber