Изменение файла в банке - PullRequest
73 голосов
/ 04 августа 2009

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

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

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

Ответы [ 12 ]

74 голосов
/ 18 августа 2013

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

Из учебников по Java:

jar uf jar-file input-file(s)

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

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

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

18 голосов
/ 02 сентября 2015

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

vim my.jar

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

9 голосов
/ 04 августа 2009

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

7 голосов
/ 04 августа 2009

Как уже говорили многие, вы не можете изменить файл в JAR без повторного сканирования JAR. Еще хуже с Launch4J, вы должны перестроить EXE, как только вы измените JAR. Так что не иди этим путем.

Обычно плохая идея помещать файлы конфигурации в JAR. Вот мое предложение. Найдите файл конфигурации в некоторых заранее определенных местах (например, в домашнем каталоге, \ Program Files \ etc). Если вы найдете файл конфигурации, используйте его. В противном случае используйте тот, что находится в JAR, в качестве запасного варианта. Если вы сделаете это, вам просто нужно записать файл конфигурации в заранее определенное место, и программа его заберет.

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

2 голосов
/ 18 апреля 2015

Не уверен, если это поможет, но вы можете редактировать без извлечения:

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

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

2 голосов
/ 04 августа 2009

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

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

1 голос
/ 25 марта 2015

Извлечение файла JAR для отл. с winrar и используйте CAVAJ:

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

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

1 голос
/ 25 апреля 2012

Выезд TrueZip .

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

1 голос
/ 25 августа 2011

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

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

1 голос
/ 04 августа 2009

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

EDIT

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

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