Зміна файлу всередині банки


87

Я хотів би змінити файл всередині моєї банки. Чи можна це зробити, не витягуючи та не перериваючи, з моєї програми?

Файл, який я хочу змінити, - це файли конфігурації, переважно на основі xml.

Причина, по якій я зацікавлений у тому, щоб не розмиватись, полягає в тому, що додаток обгортається launch4j, якщо я його розібрав, я не можу створити файл .exe знову.


1
я хотів би зберегти додаткові файли в програмі без створення тимчасових файлів у файловій системі.
Хамза Єрлікая

Спробуйте це рішення stackoverflow.com/a/4837522/1853864 Я використовував, і мої проблеми були вирішені.
A. Magalhães

Не могли б ви прийняти поточну прийняту відповідь? Він має негативний бал і абсолютно не корисний
Дічі

Відповіді:


83

Ви можете використовувати uопцію дляjar

З підручників Java:

jar uf jar-file input-file(s)

Msgstr "Будь-які файли, які вже є в архіві, мають таку ж назву шляху, що і доданий файл, будуть замінені."

Див. Розділ Оновлення файлу JAR .

Набагато краще, ніж робити всю банку спочатку. Викликання цього з вашої програми теж звучить можливо. Спробуйте запустити командний рядок на Java


Чудово! Але вони додали імена шляхів смішними. IE Bitbucket.foo.bar замість com.etc.etc, наявний
StarWind0

26

Ви можете використовувати Vim:

vim my.jar

Vim може редагувати стислі текстові файли, якщо ви перебуваєте unzipу своєму середовищі.


3
Це чудово. Перейдіть до потрібного файлу та натисніть Enter. Редагуйте файл, а потім введіть: wq, щоб зберегти!
Майкл Батлер

Також вам потрібно zipу своєму середовищі, щоб мати можливість зберегти зміни. Дякую за відповідь!
troig

11

Файли Java-jar мають той самий формат, що і zip-файли, тож якщо у вас є утиліта zip-файлу, яка дозволить вам змінити архів, ви ногу в двері. Друга проблема полягає в тому, що якщо ви хочете перекомпілювати клас або щось інше, вам, мабуть, доведеться просто перекомпонувати jar; але текстовий файл або щось інше (наприклад, xml) слід досить легко змінити.


8

Як багато хто вже говорив, ви не можете змінити файл у JAR без попередньої оплати JAR. Ще гірше з Launch4J, вам доведеться перебудувати EXE після того, як ви зміните JAR. Тож не йдіть цим шляхом.

Взагалі погана ідея розміщувати файли конфігурації в JAR. Ось моя пропозиція. Шукайте конфігураційний файл у деяких заздалегідь визначених місцях (наприклад, домашній каталог, \ Program Files \ тощо). Якщо ви знайдете файл конфігурації, використовуйте його. В іншому випадку використовуйте той, що знаходиться в JAR, як резервний. Якщо ви зробите це, вам просто потрібно написати файл конфігурації в заздалегідь визначеному місці, і програма його підбере.

Ще однією перевагою цього підходу є те, що змінений файл конфігурації не перезаписується, якщо ви оновите програмне забезпечення.


4

Не впевнений, що це допомога, але ви можете редагувати, не витягуючи:

  1. Відкрийте файл jar з редактора vi
  2. Виберіть зі списку файл, який потрібно редагувати
  3. Натисніть клавішу Enter, щоб відкрити файл, який можна змінити, і зберегти його досить просто

Перегляньте допис у блозі для отримання додаткової інформації http://vinurip.blogspot.com/2015/04/how-to-edit-contents-of-jar-file-on-mac.html


2

Це може бути більше роботи, ніж ви прагнете вирішити в короткостроковій перспективі, але я підозрюю, що в довгостроковій перспективі для вас було б дуже корисно вивчити використання Ant (або Maven , або навіть Bazel ) замість того, щоб створювати банки вручну . Таким чином, ви можете просто натиснути на мурашиний файл (якщо ви використовуєте Eclipse) і відновити банку.

Крім того, ви можете взагалі не мати цих конфігураційних файлів у банку - якщо вам потрібно регулярно замінювати ці файли або якщо він повинен розповсюджуватися між різними сторонами, конфігураційний файл не повинен бути частиною банку взагалі.


2
Домовились. Однак, можливо, ви захочете додати файл конфігурації "за замовчуванням" до JAR, тому, якщо щось трапиться із зовнішнім (пошкоджене, видалене тощо), ви можете повернутися до конфігурації за замовчуванням.
Томас Оуенс

Правда - хоча я не знаю, скільки програм продовжувало б функціонувати без своїх конфігураційних файлів ...
dimo414

1

Причина полягає в тому, що файл jar встановлений як zip-файл. Якщо ви хочете змінити файл, вам слід прочитати всі записи, змінити той, який ви хочете змінити, а потім записати записи назад у файл jar. Мені доводилося це робити раніше, і лише так я міг знайти це.

РЕДАГУВАТИ

Зверніть увагу, що для цього використовуються внутрішні редактори файлів Java, що представляють собою потоки файлів. Я впевнений, що є спосіб це зробити, ви можете прочитати всю банку в пам'ять, змінити все, а потім записати назад у потік файлів. Це те, що, як я вважаю, роблять такі утиліти, як 7-Zip та інші, оскільки я вважаю, що ToC заголовка zip повинен бути визначений під час запису. Однак я можу помилитися.


1

Так, ви можете, використовуючи SQLite, ви можете читати з бази даних або писати в базу даних із файлу jar, так що вам не доведеться витягувати, а потім повторно створювати його, слідуючи моєму допису http://shoaibinamdar.in/blog/? р = 313

використовуючи синтаксис "jdbc: sqlite :: resource:", ви зможете читати та записувати в базу даних із файлу jar


1
Привіт, ласкаво просимо до stackoverflow. Я видалив абревіатури з вашого допису. Загалом, скорочення стилів текстових повідомлень тут не підходить. Я думаю, що ця відповідь була б гарною відповіддю на запитання, якщо ви включили ще кілька деталей з вашого блогу до самої відповіді, щоб хтось, хто читає вашу відповідь, дізнався щось, навіть якщо він не читав блог, або воно рухається на іншу URL-адресу в майбутню дату.
Flexo

1

Перевірте TrueZip .

Він робить саме те, що вам потрібно (редагувати файли, вбудовані всередині файлу jar), за допомогою API віртуальної файлової системи. Він також підтримує вкладені архіви (банку всередині банки).


1

Витягніть файл jar для напр. з winrar і ​​використовуйте CAVAJ:

Cavaj Java Decompiler - це графічна безкоштовна утиліта, яка відновлює вихідний код Java із файлів CLASS.

ось відеоурок, якщо вам потрібно: https://www.youtube.com/watch?v=ByLUeem7680


ну, програмне забезпечення "Використовуй CAVAJ" - відповідь тут. Посилання є лише доповненням, якщо потрібні додаткові пояснення.
Томаш Муларчик

0

Поки цей файл не є .class, тобто файл ресурсу або файл маніфесту - ви можете.


і як, без вилучення та повторного роздратування?
user85421

0

Найпростіший спосіб зробити це в Windows - це WinRAR :

  1. Клацніть правою кнопкою миші на файлі та в контекстному меню виберіть "Відкрити за допомогою WinRAR".
  2. Перейдіть до файлу, який потрібно редагувати, і двічі клацніть на ньому, щоб відкрити його в редакторі за замовчуванням.
  3. Після внесення змін збережіть і закрийте редактор.
  4. Потім з’явиться діалогове вікно із запитом, чи хочете ви оновити файл в архіві - виберіть «Так», і JAR буде оновлено.

0

більшість відповідей вище говорять, що ви не можете зробити це для файлу класу.

Навіть якщо ви хочете оновити файл класу, ви також можете це зробити. Все, що вам потрібно зробити, це перетягнути файл класу з робочої області в банку.

Якщо ви хочете перевірити свої зміни у файлі класу, ви можете зробити це за допомогою декомпілятора, такого як jd-gui.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.