Внешняя Java-программа: Обработка SIGTERM

У меня есть java-программа (с графическим интерфейсом), которая работает на хосте. Во время выполнения пользователь может добавлять некоторые записи данных. Программа работает только с ними.

Позже система может выключиться или программа просто закроется SIGTERM.

К сожалению, кажется, что программа сохраняет записи данных только в том случае, если пользователь вручную закрывает ее с помощью «X».

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

Я попытался декомпилировать его с помощью «jd gui», который, похоже, работал более или менее. Тогда я подумал, что могу просто добавить обработчик сигнала и вызвать метод закрытия окна.

Но «jd gui» создал такой код:

/* 110:269 */       if ((??? = Thread.currentThread().getContextClassLoader()) != null) {
/* 111:270 */         return ???;

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

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

Короче говоря: возможно ли написать «программу-оболочку», которая просто обрабатывает SIGTERM, а затем вызывает «метод закрытия» JFrame (или как он называется) основного фрейма (который является единственным JFrame)?

Я просто не знаю, как вызвать такой метод внешней запущенной java-программы.

Спасибо большое.

С уважением Кевин Полезно Бесполезно


person Kevin Meier    schedule 16.08.2014    source источник


Ответы (2)


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

person jtahlborn    schedule 16.08.2014

Попробуйте деобфусцировать приложение. Посмотрите здесь (2009) - инструмент для деобфускации кодов Java.

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

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

Возможно, вы можете декомпилировать основной класс и заменить его основной метод своим собственным и добавить shutdownhook см.: Полезный пример хука выключения в Java? который вызывает метод onClose (деобфускированный).

В любом случае, интересный и сложный вопрос!

person Diversity    schedule 16.08.2014
comment
Спасибо за инструмент для деобфускации кода Java. Это действительно помогло мне понять, как работает код (и как написать хук). Спасибо:) - person Kevin Meier; 17.08.2014