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

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) должно быть достаточно легко модифицировано.

JustJeff
источник
8

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

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

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

ZZ Coder
источник
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.

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

dimo414
источник
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).

GreenGiant
источник
1

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

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

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

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

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

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

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

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

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

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

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

Субхам Суд
источник