Memodifikasi file di dalam toples

88

Saya ingin mengubah file di dalam toples saya. Apakah mungkin melakukan ini tanpa mengekstrak dan mengguncang ulang, dari dalam aplikasi saya?

File yang ingin saya modifikasi adalah file konfigurasi, kebanyakan berbasis xml.

Alasan saya tertarik untuk tidak menghapusnya adalah bahwa aplikasi dibungkus dengan launch4j jika saya unjar, saya tidak dapat membuat file .exe lagi.

Hamza Yerlikaya
sumber
1
saya ingin menyimpan file tambahan dalam aplikasi tanpa membuat file temp pada sistem file.
Hamza Yerlikaya
Coba solusi ini stackoverflow.com/a/4837522/1853864 yang saya gunakan dan masalah saya terpecahkan.
A. Magalhães
Bisakah Anda tidak menerima jawaban yang diterima saat ini? Ini memiliki skor negatif dan sama sekali tidak membantu
Dici

Jawaban:

84

Anda dapat menggunakan uopsi untukjar

Dari Tutorial Java:

jar uf jar-file input-file(s)

"Semua file yang sudah ada di arsip dengan nama jalur yang sama dengan file yang ditambahkan akan ditimpa."

Lihat Memperbarui File JAR .

Jauh lebih baik daripada membuat seluruh toples lagi. Memanggil ini dari dalam program Anda juga terdengar mungkin. Coba Jalankan Command Line di Java

clwhisk
sumber
Hebat! Tapi mereka menambahkan nama jalan yang lucu. IE Bitbucket.foo.bar sebagai pengganti com.etc.etc yang sudah ada
StarWind0
26

Anda dapat menggunakan Vim:

vim my.jar

Vim dapat mengedit file teks terkompresi, yang Anda miliki unzipdi lingkungan Anda.

Jose Alban
sumber
3
Ini bagus. Arahkan ke file yang Anda cari dan tekan Enter. Edit file, lalu ketik: wq untuk menyimpan!
Michael Butler
Anda juga perlu zipdi lingkungan Anda, untuk dapat menyimpan perubahan. Terima kasih atas jawabannya!
troig
11

File jar Java memiliki format yang sama dengan file zip - jadi jika Anda memiliki utilitas file zip yang memungkinkan Anda memodifikasi arsip, Anda dapat melakukannya. Masalah kedua adalah, jika Anda ingin mengkompilasi ulang kelas atau sesuatu, Anda mungkin hanya perlu membuat ulang toples; tetapi file teks atau sesuatu (xml, misalnya) harus cukup mudah dimodifikasi.

JustJeff
sumber
8

Seperti yang dikatakan banyak orang, Anda tidak dapat mengubah file di JAR tanpa membatalkan JAR. Lebih buruk lagi dengan Launch4J, Anda harus membangun kembali EXE setelah Anda mengubah JAR. Jadi jangan ikuti rute ini.

Biasanya tidak baik untuk meletakkan file konfigurasi di JAR. Ini saran saya. Cari file konfigurasi Anda di beberapa lokasi yang ditentukan sebelumnya (seperti direktori home, \ Program Files \ etc). Jika Anda menemukan file konfigurasi, gunakanlah. Jika tidak, gunakan yang ada di JAR sebagai fallback. Jika Anda melakukan ini, Anda hanya perlu menulis file konfigurasi di lokasi yang telah ditentukan dan program akan mengambilnya.

Manfaat lain dari pendekatan ini adalah file konfigurasi yang dimodifikasi tidak akan ditimpa jika Anda memutakhirkan perangkat lunak Anda.

ZZ Coder
sumber
2

Ini mungkin lebih banyak pekerjaan daripada yang ingin Anda tangani dalam jangka pendek, tetapi saya kira dalam jangka panjang akan sangat bermanfaat bagi Anda untuk menggunakan Ant (atau Maven , atau bahkan Bazel ) daripada membuat toples secara manual. . Dengan begitu Anda cukup mengklik file ant (jika Anda menggunakan Eclipse) dan membangun kembali jar.

Atau, Anda mungkin ingin tidak memiliki file konfigurasi ini sama sekali di jar - jika Anda berharap perlu mengganti file ini secara teratur, atau jika seharusnya didistribusikan ke banyak pihak, file konfigurasi tidak boleh menjadi bagian dari toples sama sekali.

dimo414
sumber
2
Sepakat. Namun, Anda mungkin ingin meletakkan file konfigurasi "default" di JAR, jadi jika sesuatu terjadi pada file eksternal (rusak, terhapus, dll), Anda dapat kembali ke konfigurasi default.
Thomas Owens
Benar - meskipun saya tidak tahu berapa banyak aplikasi yang akan terus berfungsi tanpa file konfigurasinya ...
dimo414
1

Untuk memperluas apa yang dikatakan dfa, alasannya adalah karena file jar diatur seperti file zip. Jika Anda ingin mengubah file, Anda harus membaca semua entri, memodifikasi yang ingin Anda ubah, dan kemudian menulis entri kembali ke dalam file jar. Saya harus melakukan ini sebelumnya, dan itulah satu-satunya cara saya dapat melakukannya.

EDIT

Perhatikan bahwa ini menggunakan editor file jar internal ke Java, yang merupakan aliran file. Saya yakin ada cara untuk melakukannya, Anda dapat membaca seluruh toples ke dalam memori, memodifikasi semuanya, lalu menulis kembali ke aliran file. Itulah yang saya percaya utilitas seperti 7-Zip dan lainnya lakukan, karena saya percaya ToC dari tajuk zip harus ditentukan pada waktu penulisan. Namun, saya bisa saja salah.

aperkins
sumber
1

Ya Anda bisa, dengan SQLite Anda dapat membaca atau menulis ke database dari dalam file jar, sehingga Anda tidak perlu mengekstrak dan kemudian memasukkannya kembali, ikuti posting saya http://shoaibinamdar.in/blog/? p = 313

menggunakan sintaks "jdbc: sqlite :: resource:" Anda akan dapat membaca dan menulis ke database dari dalam file jar

shoaib
sumber
1
Hai, selamat datang di stackoverflow. Saya telah menghapus singkatan dari postingan Anda. Secara umum, singkatan gaya pesan teks tidak sesuai di sini. Saya pikir jawaban ini akan menjadi jawaban yang bagus untuk pertanyaan jika Anda memasukkan lebih banyak detail dari blog Anda, di dalam jawaban itu sendiri sehingga seseorang yang membaca jawaban Anda mempelajari sesuatu bahkan jika mereka tidak membaca blog, atau tersentuh ke URL lain di masa mendatang.
Flexo
1

Lihat TrueZip .

Itu persis seperti yang Anda inginkan (untuk mengedit file secara inline di dalam file jar), melalui API sistem file virtual. Ini juga mendukung arsip bersarang (toples di dalam toples) juga.

GreenGiant
sumber
1

Ekstrak file jar untuk ex. dengan winrar dan gunakan CAVAJ:

Cavaj Java Decompiler adalah utilitas freeware grafis yang merekonstruksi kode sumber Java dari file CLASS.

berikut adalah video tutorial jika Anda membutuhkan: https://www.youtube.com/watch?v=ByLUeem7680

Tomasz Mularczyk
sumber
nah, software "Use CAVAJ" adalah jawabannya di sini. Tautan hanya tambahan jika diperlukan penjelasan tambahan.
Tomasz Mularczyk
0

Selama file ini bukan .class, yaitu file sumber daya atau file manifes - Anda bisa.

Sorantis
sumber
dan bagaimana, tanpa mengekstraksi dan mengguncang kembali?
pengguna85421
0

Cara termudah yang saya temukan untuk melakukan ini di Windows adalah dengan WinRAR :

  1. Klik kanan pada file tersebut dan pilih "Open with WinRAR" dari menu konteks.
  2. Arahkan ke file yang akan diedit dan klik dua kali untuk membukanya di editor default.
  3. Setelah melakukan perubahan, simpan dan keluar dari editor.
  4. Sebuah dialog kemudian akan muncul menanyakan apakah Anda ingin memperbarui file dalam arsip - pilih "Ya" dan JAR akan diperbarui.
Steve Chambers
sumber
0

sebagian besar jawaban di atas mengatakan Anda tidak dapat melakukannya untuk file kelas.

Bahkan jika Anda ingin memperbarui file kelas, Anda juga dapat melakukannya. Yang perlu Anda lakukan adalah menyeret dan melepas file kelas dari ruang kerja Anda di dalam jar.

Jika Anda ingin memverifikasi perubahan Anda di file kelas, Anda dapat melakukannya menggunakan dekompiler seperti jd-gui.

Subham Sood
sumber