Отладка запущенного приложения JNLP
Я создал настольное приложение Java (используя Swing) и теперь пытаюсь заставить его работать, запустив его из сети с помощью JNLP. Приложение отлично работает, когда я запускаю его с терминала, но как только я запускаю его из JNLP, он не закрывается. Я должен вручную убивать процесс каждый раз.
Я читал, что может быть проблема, если мой JFrame
использует DISPOSE_ON_CLOSE
как операция закрытия по умолчанию, но это не так. Он использует DO_NOTHING_ON_CLOSE
(неявно). Кроме того, я явно вызываю System.exit(0)
после освобождения всех моих объектов:
f = new JFrame("Pacman");
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// Terminate the Game-loop:
GameLoop.INSTANCE.stopLoop();
// Close the application:
System.exit(0);
}
});
Я думаю, что может возникнуть исключение, когда я закрываю приложение, но я не могу найти способ получить консольный вывод (например, трассировку стека) запущенного приложения, запущенного с JNLP. Вот что я попробовал:
- старт
javaws
с параметрами отладки и соединитесь сjconsole
(работает, но я не могу найти никакого исключения - или консоли-ouput). - старт
javaws
С отладку параметры и прикрепить к нему отладчик IntelliJ (также работает, но не дает мне никаких выходных данных)
Итак, как я могу запустить приложение с помощью JNLP и получить вывод (записанный в потоки out - и error-streams по умолчанию), как если бы я делал это с обычным настольным приложением?
2 ответов
Решение #1-включить консоль Java и искать исключения.
вы можете сделать это через Панель Управления Java. Перейти дополнительно вкладка и в Java-Консоль убедится показать консоль выбран.
затем запустите приложение и проверьте консоль на наличие исключений. Исправьте исключение.
решение № 2 - отладка запущенного приложения (правильно).
запуск веб-запуска app, как это (для Java 1.6 и новее):
javaws -verbose -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=8123 http://myserver.com/path/to/myapp.jnlp
при использовании более ранних версий java (1.4.2, 1.5) установите переменную среды, например:
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=8123"
и запустить приложение через:
javaws http://myserver.com/path/to/myapp.jnlp
когда приложение работает:
- прикрепить отладчик (Eclipse будет делать-use Run =>Отладка Конфигураций =>Удаленное Приложение Java и Свойства Соединения панель входа в порт передано в параметрах в
javaws
(в данном случае:8123
). - установите точку останова внутри вашего
windowClosing
метод. - попробуйте закрыть приложение-Eclipse должен прервать выполнение на вашей точке останова
-
шаг на
GameLoop.INSTANCE.stopLoop()
метод, чтобы увидеть, где/когда он зависает.
не ожидайте увидеть решения в консоли, просто выполните шаг через код с отладчиком - если приложение зависнет, оно будет покажу где.
бывают случаи, когда даже консоль ничего не показывает, например, когда есть проблема с рукопожатием TLS/SSL (т. е. close_notify или handshake_failure). В этих случаях необходимо сделать следующее:
включить журналы Java и трассировку в Панели Управления Java > дополнительно.
-
включить параметры для отладки Java и запуска с расширением. jnlp, есть два пути вы можете сделать это:
2.a. Загрузите файл JNLP и выполните его из командной строки ( не требуется в данном случае).
set JAVA_TOOL_OPTIONS=-Djavax.net.debug=all javaws -wait jnlp.jnlp
2.b. Добавить аргументы (т. е.
-Djavax.net.debug=all
) для JVM в Панели Управления Java > Java > View (это не требуется в данном конкретном случае) и запустите файл JNLP из браузера: -
журналы и следы расположены в
log
каталог из Java Deployment Home откуда я вставляю эти места:a. Windows XP:
%HOME%\Application Data\Sun\Java\Deployment
b. Windows 7 / Vista:
%APPDATA%\..\LocalLow\Sun\Java\Deployment
c. Linux / Solaris:
%HOME%/.java/deployment