Изменить исполняемый файл Jar - PullRequest
8 голосов
/ 17 марта 2010

Hello Stack Overflow друзья. У меня есть простая проблема, которая, боюсь, не имеет простого решения, и мне нужен совет о том, как действовать. Я занимаюсь разработкой java-приложения, упакованного в виде исполняемого JAR-файла, но для него требуется изменить часть содержимого JAR-файла во время выполнения. На этом этапе я столкнулся с проблемой, потому что некоторые ОС блокируют файл, предотвращая запись в него.

Крайне важно, чтобы пользователь видел обновленную версию файла JAR ко времени выхода приложения, хотя я могу быть довольно гибким в отношении того, как этого добиться. Чистое и эффективное решение, очевидно, предпочтительнее, но мобильность является единственным жестким требованием.

Ниже приведены три подхода к решению проблемы, которые вы можете прокомментировать или предложить другим.

  1. Скажите Java, чтобы разблокировать файл JAR для записи (это не представляется возможным, но это было бы самое простое решение)
  2. Скопируйте исполняемые файлы классов в временный файл при запуске приложения, используйте загрузчик классов, чтобы загрузить эти файлы и выгрузить их из исходного JAR-файла. (Не имел большого опыта работы с загрузчиками классов, но, надеюсь, тогда JVM будет умным Достаточно, чтобы понять, что оригинальный JAR используется дольше, и поэтому разблокируйте его)
  3. Поместите второй исполняемый JAR-файл внутрь First, при запуске извлеките внутренний jar-файл во временный файл, вызовите новый java-процесс, используя скопированный внутренний JAR-файл, и передайте ему расположение внешнего JAR-файла, первый процесс завершится, второй процесс модифицирует Внешняя банка не заполнена. (Это сработает, но я не уверен, что существует одно платформенное решение, при котором одно Java-приложение вызывает другое)

Я знаю, что это странный вопрос, но любая помощь будет признательна.

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Один вариант:

Пусть программа запишет измененную копию файла JAR.

Включите в файл JAR второй JAR с утилитой, которая при запуске удаляет исходный файл JAR и переименовывает измененную копию в соответствии с оригиналом.

Когда ваша программа завершает работу (и в нее вносятся изменения), извлеките эту утилиту и запустите ее в своей собственной JVM (используя Runtime.getRuntime().exec()). Утилита будет ждать, пока блокировка отключится от исходного неизмененного JAR, а затем выполнит свою работу и выйдет.

Для пользователя файл JAR, по-видимому, обновляется при выходе (или достаточно близко!).

1 голос
/ 18 марта 2010

Я, честно говоря, считаю, что ваш подход ошибочен. Это просто не подходит для стандартного способа развертывания Java. Ваши измененные файлы будут просто сохраняться где-то в БД или XML-файле - это ЕДИНСТВЕННЫЙ разумный подход.

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

...