Сбой апплета на машинах, отличных от машины разработки

#java #applet #java-web-start #next-generation-plugin

#java #апплет #java-web-start #плагин следующего поколения

Вопрос:

Я разрабатываю Java-апплет, и недавно я попытался продемонстрировать апплет на машине, которая мне не принадлежала. Однако мне не удалось запустить апплет на этой машине, поскольку он продолжал сбоить из-за исключений безопасности. Апплет можно найти по адресу http://www.cs.rpi.edu /~madiav/launch.html.

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

Весь вывод из консоли Java можно найти здесь http://pastebin.com/DjFAJgVW Примером строки типа class not found является

 basic: JNLP2ClassLoader.findClass: RhythmWheels.Open: try again ..
  

Кто-нибудь знает, как я могу избавиться от них и / или является ли это причиной сбоя выполнения на других машинах?

Комментарии:

1. Вы написали этот апплет? Или это сторонняя вещь? Апплеты, которые запускаются на рабочем столе в appletviewer, могут обходиться без всего, что не будет запускаться в браузере, включая файловый ввод-вывод и произвольные сетевые подключения.

2. Я разрабатываю апплет, и он работает нормально, когда я запускаю его со своего веб-сайта на своем рабочем столе с помощью Chrome и Firefox, однако он не запускается на компьютере моих коллег.

3. Для более быстрой помощи 1) Опубликуйте SSCCE кода (я не перехожу по этой ссылке). 2) URL-адрес апплета. Немногие перейдут по ссылке на апплет, особенно для надежного или большого апплета, но попробовать стоит. Кстати, имеет ли апплет цифровую подпись?

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

5. Проблема не в коде как таковом, а в том, как java обрабатывает загрузку кода, поэтому SSCCE не сильно поможет. Как ни странно, я просто случайно посмотрел, что такое SSCCE, примерно за 10 минут до того, как я опубликовал этот вопрос.

Ответ №1:

Сообщения «класс не найден» обычно можно уменьшить, добавив ..

 <param name='codebase_lookup' value='false'> 
  

..к applet элементу. По крайней мере, если классы являются Jar’d.

Подробности см. в разделе Специальные атрибуты апплета.


Примечание: Это апплет param в HTML, не а param в файле JNLP.


Попросите вашего друга сообщить о свойствах java.version и java.vendor.


Апплеты могут быть настроены только с помощью JNLP из Sun 1.6.0_10 . Даже тогда браузер необходимо было специально настроить для использования подключаемого модуля «следующего поколения» в Linux. Лучше всего (по крайней мере, при тестировании) поместить в элемент applet в HTML совершенно другой апплет (аналогичный тому, который указан в JNLP), чтобы определить, выполняется ли поведение ‘next gen. / plug-in2’.


Правка 2:

Тестирование: при отказе в диалоге доверия:

 exception: exit(-1).
ExitException[ 4]java.lang.RuntimeException: exit(-1)
    at com.sun.javaws.Main.systemExit(Unknown Source)
    at com.sun.javaws.security.AppPolicy.grantUnrestrictedAccess(Unknown Source)
    at com.sun.javaws.LaunchDownload.checkSignedResourcesHelper(Unknown Source)
    at com.sun.javaws.LaunchDownload.checkSignedResources(Unknown Source)
    at sun.plugin2.applet.JNLP2Manager.prepareLaunchFile(Unknown Source)
    at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: ExitException[ 4]java.lang.RuntimeException: exit(-1)
  

Откуда ExitException берется? Я не вижу никаких упоминаний о коде, отличном от Sun, в трассировке, но я не знаком с этим точным RuntimeException .

Убедитесь, что фрейм не пытается вызвать JFrame.EXIT_ON_CLOSE . Даже доверенному апплету не разрешено завершать текущий экземпляр виртуальной машины. Я понял, как «обойти» это один раз, и попробовал это — чтобы увидеть полный сбой браузера. 😉

Тестирование: когда диалоговое окно доверия в порядке,:

Апплет запускается и выдает кнопку для запуска свободно плавающего «микшера». Кнопки могут издавать звук, но не смогли определить его оттуда.


Почему именно этому апплету нужно доверие?


Вероятно, было бы лучше отказаться от апплета и позволить JNLP запустить JFrame его напрямую.

Поскольку вы, похоже, ожидаете, что у конечного пользователя будет версия 1.6.0 (_10 ), также было бы целесообразно вызвать setMinimumSize() на JFrame после pack() вызова.

Комментарии:

1. Спасибо за попытку. Я добавил эквивалентное свойство в свой файл JNLP, и эти сообщения не исчезли. Я предполагаю, что эти сообщения связаны с другой проблемой.

2. @Varun Madiath Смотрите изменения в моем ответе, основанные на последней информации.

Ответ №2:

Однако мне не удалось запустить апплет на этой машине, поскольку он продолжал сбоить из-за исключений безопасности.

Я получаю предупреждение о сертификате, но затем он запускается. Возможно, проблемы с версией Java? У меня довольно свежая версия 1.6.

Комментарии:

1. Я также использую Java 1.6. Но это может быть именно так. Мне никогда не приходило в голову, что мой коллега будет использовать более старую версию, учитывая проделанную работу, но я рассмотрю это.