Есть ли способ патчить файлы JAR?
Предположим, я отправил кому-то большой кувшин или военный файл. Могу ли я позже просто изменить один небольшой раздел и отправить его ему? Предположим, я только что изменил один файл класса. Я перекомпилировал Java для в файл класса. Иначе, чем обменять новый файл класса на старый файл класса, там что-нибудь еще, что я должен сделать?
В java нужно ли перестраивать весь файл jar/war? Кроме того, есть ли пакет с открытым исходным кодом для обновления?
7 ответов
Человек, получающий файл класса, может просто добавить этот файл в банку, если он знает, в какую директорию его поместить. Будьте утомлены подписанными банками, как отмечено в комментариях.
jar uf foo.jar foo.class
http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/jar.html
Вы можете скопировать измененный файл.class таким образом.
jar uf test.jar com\test\Test.class
Если для вас есть логический способ выделить компоненты в отдельные файлы JAR, я бы создал файл JAR для каждого типа компонента. Таким образом, вам не придется перераспределять все обратно клиенту. Например, взгляните на то, как Spring 3 выделяет компоненты.
Есть JARDiff, предназначенный для обновления приложений Java WebStart.
Просто откройте свой jar-файл с помощью 7zip и перезапишите отредактированные вами классы. Убедитесь, что сначала сделали резервную копию.
Посмотрите на использование jar
команда. Опция u позволяет обновить существующий архив.
Вам нужно будет восстановить весь файл JAR, если вы не хотите, чтобы они разархивировали, перезаписать файл и заново.
Если у вас есть старый и новый jar-файл, вы можете создать xdelta для обоих и отправить только дельта-файл вашему клиенту, который должен быть намного меньше, чем весь jar-файл, если вы изменили только один класс из множества. Это также должно работать для подписанных jar-файлов, но требует, чтобы и отправитель, и получатель имели программу xdelta (или могли ее установить).
И, конечно, вы должны сначала создать новую банку (но это можно сделать методами, уже упомянутыми в других ответах).