Проблема и вопрос: 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 (), то есть с конкретным загрузчиком, используемым в веб-запуске.
С уважением,
Роберт