Java WebStart медленный, запрашивает библиотеки из неверной папки - PullRequest
3 голосов
/ 24 апреля 2011

Проблема и вопрос: Java-приложение, запущенное в сети, ищет свои классы в базовой папке вместо ./lib.

Как предложено в аналогичном вопросе на Приложения Java Web Start неоднократно запрашивают несуществующие файлы Я выключил подпись фляги, чтобы исключить проблему безопасности, и проблема не устранена.

Ниже приведен чистый пример того, что происходит по сети для этой простой Java.программа:

public static void main(String[] args) {
    // TODO code application logic here
    System.out.println("Hello World! Initializing the class from the jar residing in lib/ folder. Expecting heavy network traffic...");

    //This class resides in lib/SampleJavaLibrary.jar
    //Initializing it just to excercise the class loader problem
    CDummyClass sDummy = new CDummyClass();

    System.out.println("Done");

}

В сети (по wireshark) можно наблюдать повторные запросы на jar-файлы в базовой папке. На некоторых вызовах я насчитал до 10 повторных попыток, отвечаемых веб-сервером с 404. В конечном итоге,loadClass успешен, но только после 10 или более запросов о несуществующих банках.Умножьте это на количество классов, доступных в данной программе, и вы получите очень медленную инициализацию.В этом простом случае есть «только» 2 попытки для этого простого класса.

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

6   0.020921    192.168.1.35    192.168.1.130   HTTP    GET /mnt/vbox/workspace/WebStartSample/distC/launch.jnlp HTTP/1.1
8   0.028092    192.168.1.130   192.168.1.35    HTTP    HTTP/1.1 200 OK  (application/x-java-jnlp-file)
10  0.514038    192.168.1.35    192.168.1.130   HTTP    GET /mnt/vbox/workspace/WebStartSample/distC/lib/SampleJavaLibrary.jar HTTP/1.1 
11  0.520688    192.168.1.130   192.168.1.35    HTTP    HTTP/1.1 200 OK  (application/java-archive)
12  0.618640    192.168.1.35    192.168.1.130   HTTP    GET /mnt/vbox/workspace/WebStartSample/distC/WebStartSample.jar HTTP/1.1 
14  0.652541    192.168.1.130   192.168.1.35    HTTP    HTTP/1.1 200 OK  (application/java-archive)

Этотам, где начинается проблема, при вызове библиотечного класса:

16  0.943801    192.168.1.35    192.168.1.130   HTTP    GET /mnt/vbox/workspace/WebStartSample/distC/SampleJavaLibrary.jar HTTP/1.1 
18  0.991748    192.168.1.130   192.168.1.35    HTTP    HTTP/1.1 404 Not Found  (text/html)
22  0.997281    192.168.1.35    192.168.1.130   HTTP    GET /mnt/vbox/workspace/WebStartSample/distC/SampleJavaLibrary.jar HTTP/1.1 
24  1.004799    192.168.1.130   192.168.1.35    HTTP    HTTP/1.1 404 Not Found  (text/html)

В конечном итоге, после повторной попытки выше, класс будет найден и инициализирован (!), скорее всего из уже существующего jar, который был загружен при запуске приложения.

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

FWIW, вот мой файл jnlp, и да, я пробовал все варианты тега обновления, lazy, нетерпеливо, без изменений

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://mydebian.mydomain/mnt/vbox/workspace/WebStartSample/distC"    href="launch.jnlp" spec="1.0+">
    <information>
        <title>WebStartSample</title>
        <vendor>user</vendor>
        <homepage href=""/>
        <description>WebStartSample</description>
        <description kind="short">WebStartSample</description>

    </information>
<update check="always"/>

    <resources>
<j2se version="1.5+"/>
<jar href="WebStartSample.jar" main="true"/>


    <jar href="lib/SampleJavaLibrary.jar"/>
</resources>
    <application-desc main-class="webstartsample.Main">

    </application-desc>
</jnlp>

Я подозреваю, что что-то не так с JNLPClassLoader (), то есть с конкретным загрузчиком, используемым в веб-запуске.

С уважением,

Роберт

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

Спасибо всем за предложения.Эндрю намекнул «индексировать банки», что указывало мне на правильное направление ...

А именно, банки (которые были выбраны для моей текущей IDE, Netbeans) были проиндексированы .Однако META-INF / INDEX.LIST в главном банке содержал ссылки на другие банки, как если бы они находились в текущей папке рядом с основным банкой.

JarIndex-Version: 1.0

WebStartSample.jar
webstartsample

SampleJavaLibrary.jar
newpackage

Это привело к jnlpClassLoader (),используя основной индекс и ища jar-файлы в URL кодовой базы, в то время как они фактически находятся в подпапке ./lib url.

Вот как выглядит правильный индекс (воссозданный вручную):

JarIndex-Version: 1.0

WebStartSample.jar
webstartsample

lib/SampleJavaLibrary.jar
newpackage

Чтобы усугубить проблему, такое запущенное в сети приложение не будет работать без ошибок, сначала они просто будут искать классы / файлы jar в неправильных местах, а затем, в конце концов, найдут их, предположительно уже загруженный загрузчик bu jnlp, как описано в исходном вопросе.

Вкратце, это относится к процедуре сборки и упаковки Netbeans.

Моим немедленным исправлением было отключение индексации jar, что привело к правильному и минимальному сетевому трафику и значительно улучшило инициализацию приложения.

Чтобы сделать это в Netbeans, перейдите в Tools-> Options-> Разное-> Муравьи-> Свойства и добавьте jar.index=false

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

Опять же, спасибо всем за предложения.

ps.

  • janela util не обнаружил серьезных сбоев в моем элементе пакета jnlp
  • , включая без изменений
  • mydebian ссылается на мой сервер,клиент win7 со всеми последними и лучшими java-средами выполнения и jdks, включая netbeans 6.9 (также протестирован с 7.0, произведен такой же проблемный индекс)
2 голосов
/ 24 апреля 2011

Рекомендации:

  1. Подтвердите JNLP, используя JaNeLA .На мой взгляд, это справедливо, но JaNeLA - лучший судья.
  2. Включите элемент package для каждой банки.Этот элемент упоминается в разделе Ресурсы синтаксиса файла JNLP (также раскрыт в таблице вверху страницы).Для получения дополнительной информации об элементе package перейдите по ссылке на странице к (только для скачивания) спецификации API.И, кроме того, API Spec.это единственный лучший ресурс на JWS.Я бы хотел, чтобы Oracle сделал его доступным для просмотра в Интернете.
  3. Индексируйте файлы Jar.
  4. Продолжайте задавать такие замечательные (хорошо продуманные, хорошо изученные, хорошо представленные) вопросы.:)
0 голосов
/ 24 апреля 2011

Имя хоста "mydebian.mydomain" указывает на то, что вы работаете в Debian, где OpenJDK является реализацией Java по умолчанию.

Реализация Sun Java WebStart является , а не частью OpenJDK, поэтомуальтернативная реализация используется.Поскольку Java WebStart не имеет официального TCK, в реализации OpenJDK есть тонкие различия и даже ошибки, которые нужно искать вручную (так как нет официального TCK).

Я бы предложил попробовать с Sun JVM (например, в Windows) и посмотрите, изменится ли поведение.

...