Отладка запущенного приложения 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

когда приложение работает:

  1. прикрепить отладчик (Eclipse будет делать-use Run =>Отладка Конфигураций =>Удаленное Приложение Java и Свойства Соединения панель входа в порт передано в параметрах в javaws (в данном случае: 8123).
  2. установите точку останова внутри вашего windowClosing метод.
  3. попробуйте закрыть приложение-Eclipse должен прервать выполнение на вашей точке останова
  4. шаг на GameLoop.INSTANCE.stopLoop() метод, чтобы увидеть, где/когда он зависает.

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


бывают случаи, когда даже консоль ничего не показывает, например, когда есть проблема с рукопожатием TLS/SSL (т. е. close_notify или handshake_failure). В этих случаях необходимо сделать следующее:

  1. включить журналы Java и трассировку в Панели Управления Java > дополнительно. Java Control Panel: logs and tracing

  2. включить параметры для отладки 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 из браузера:

    Java Control Panel: jvm arguments

  3. журналы и следы расположены в 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