Изменение файла внутри фляги


87

Я хочу изменить файл в моей банке. Можно ли сделать это из моего приложения без извлечения и повторной обработки?

Файл, который я хочу изменить, - это файлы конфигурации, в основном на основе xml.

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


1
Я хотел бы сохранить дополнительные файлы в приложении без создания временных файлов в файловой системе.
Хамза Ерликая

Попробуйте это решение stackoverflow.com/a/4837522/1853864 Я использовал, и мои проблемы были решены.
A. Magalhães

Не могли бы вы отклонить текущий принятый ответ? Он имеет отрицательный результат и абсолютно бесполезен
Дичи

Ответы:


83

Вы можете использовать uопцию дляjar

Из учебных пособий по Java:

jar uf jar-file input-file(s)

«Любые файлы, уже находящиеся в архиве, имеющие тот же путь, что и добавляемый файл, будут перезаписаны».

См. Обновление файла JAR .

Намного лучше, чем делать всю банку заново. Вызов этого из вашей программы тоже возможен. Попробуйте запустить командную строку на Java


Потрясающие! Но они забавно добавляли пути. IE Bitbucket.foo.bar вместо com.etc.etc в существующем
StarWind0

26

Вы можете использовать Vim:

vim my.jar

Vim может редактировать сжатые текстовые файлы, если они есть unzipв вашей среде.


3
Это круто. Перейдите к файлу, который вы ищете, и нажмите Enter. Отредактируйте файл и введите: wq to save!
Майкл Батлер,

Также вам нужно zipв вашем окружении, чтобы иметь возможность сохранять изменения. Спасибо за ответ!
troig 04

11

Файлы jar в Java имеют тот же формат, что и 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 ) вместо создания jar-файлов вручную. . Таким образом, вы можете просто щелкнуть файл ant (если вы используете Eclipse) и перестроить jar.

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


2
Согласовано. Однако вы можете захотеть поместить файл конфигурации «по умолчанию» в JAR, чтобы, если что-то случится с внешним файлом (повреждено, удалено и т. Д.), Вы можете вернуться к конфигурации по умолчанию.
Томас Оуэнс,

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

1

Чтобы расширить то, что сказал dfa, причина в том, что файл jar настроен как zip-файл. Если вы хотите изменить файл, вы должны прочитать все записи, изменить ту, которую вы хотите изменить, а затем записать записи обратно в файл jar. Мне приходилось делать это раньше, и это был единственный способ сделать это.

РЕДАКТИРОВАТЬ

Обратите внимание, что здесь используются внутренние для Java редакторы файлов jar, которые являются файловыми потоками. Я уверен, что есть способ сделать это: вы можете прочитать всю банку в памяти, изменить все, а затем записать обратно в файловый поток. Я считаю, что это то, что делают такие утилиты, как 7-Zip и другие, поскольку я считаю, что ToC zip-заголовка должен быть определен во время записи. Однако я мог ошибаться.


1

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

используя синтаксис «jdbc: sqlite :: resource:», вы сможете читать и записывать в базу данных из файла jar


1
Привет, добро пожаловать в stackoverflow. Я удалил аббревиатуры из вашего сообщения. В общем случае сокращенный стиль текстового сообщения здесь не подходит. Я думаю, что этот ответ был бы хорошим ответом на вопрос, если бы вы включили еще несколько деталей из своего блога в сам ответ, чтобы кто-то, читающий ваш ответ, узнал что-то, даже если они не читают блог, или он будет перемещен на другой URL-адрес в будущем.
Flexo

1

Проверьте TrueZip .

Он делает именно то, что вы хотите (редактировать файлы внутри файла jar), через API виртуальной файловой системы. Он также поддерживает вложенные архивы (jar внутри jar).


1

Извлеките файл jar, например. с winrar и используйте CAVAJ:

Cavaj Java Decompiler - это бесплатная графическая утилита, которая восстанавливает исходный код Java из файлов CLASS.

вот видеоурок, если вам нужен: https://www.youtube.com/watch?v=ByLUeem7680


Что ж, ответ здесь - программное обеспечение "Use CAVAJ". Ссылка является просто дополнением, если требуется какое-либо дополнительное объяснение.
Tomasz Mularczyk

0

Если этот файл не является .class, то есть файлом ресурсов или файлом манифеста - вы можете.


а как без извлечения и перетряски?
user85421

0

Самый простой способ сделать это в Windows - использовать WinRAR :

  1. Щелкните файл правой кнопкой мыши и выберите в контекстном меню «Открыть с помощью WinRAR».
  2. Перейдите к файлу, который нужно отредактировать, и дважды щелкните его, чтобы открыть в редакторе по умолчанию.
  3. После внесения изменений сохраните и выйдите из редактора.
  4. Затем появится диалоговое окно с вопросом, хотите ли вы обновить файл в архиве - выберите «Да», и JAR будет обновлен.

0

в большинстве ответов выше говорится, что вы не можете сделать это для файла класса.

Даже если вы хотите обновить файл класса, вы также можете это сделать. Все, что вам нужно сделать, это перетащить файл класса из рабочего пространства в jar.

Если вы хотите проверить свои изменения в файле класса, вы можете сделать это с помощью декомпилятора, такого как jd-gui.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.