Запуск внешней программы перед выходом из Java иногда завершается неудачно - PullRequest
0 голосов
/ 01 октября 2018

У меня есть Java-программа, работающая в Windows XP через 10 систем, которая вызывает программу (Mover.exe) перед ее выходом.Я хочу, чтобы после выхода java-программы Mover.exe перезаписывал и обновлял java-программу загруженными файлами.

Я использую new ProcessBuilder(progname, options).directory(tempDir).start(); для вызова Mover.exe, но он работает только с перебоями.

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

Кто-нибудь имел дело с попытками создать свой собственный модуль обновления с помощью Java или видел хорошее руководство по работе с этимитип вопросов?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Plug-and-play имеет одну форму в java: java SPI (интерфейс предоставления услуг).

  • api.jar с package x.y.z; public interface Pluggable { void exec(String[] args); }.
  • mainapp.jar : крошечное приложение, которое проверяет подключаемый модуль на пути к классам через интерфейс, запускает самое последнее, может быть, удаляет самое старое.
  • plugin12.jar с package u.v.w; public class Plugin12 extends Pluggable { ... } и текстовым файлом META-INF/services/x.y.z.Pluggable со строкой u.v.w.App12.
  • plugin13.jar с package u.v.w; public class Plugin13 extends Pluggable { ... } и текстовым файлом META-INF/services/x.y.z.Pluggable сline u.v.w.App13.

. classpath может быть общим каталогом с банками.

ServiceLoader<Pluggable> loader = ServiceLoader .load(Pluggable.class);
Iterator<Pluggable> iter = loader.iterator();
... pick by latest class name or such
pluggable.exec(args);

По общему признанию, это работает по-другому, но не зависит от специфики системы (Linux, любая Windows).

0 голосов
/ 01 октября 2018

Некоторое время назад я решил похожую проблему, сгенерировав пакет .cmd, который подождал пару секунд, а затем запустил инструмент (Mover.exe в вашем случае).

Более красивое решение - наличие "панели запуска""приложение, которое просто

  • запускает ваше приложение,
  • запускает Mover.exe, если как-то сигнализируется (например, специальный exitCode),
  • (почти) никогда не нужно обновлятьсамо по себе

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

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