Проблема и вопрос: веб-приложение Java ищет свои классы в базовой папке вместо ./lib.
Как было предложено в аналогичном вопросе в приложения Java Web Start неоднократно запрашивают несуществующие файлы, я отключил off strong> подпись jar, чтобы исключить проблему безопасности, и проблема сохраняется.
Ниже приведен чистый пример того, что происходит по сети для этой простой 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, и да, я пробовал все варианты тега обновления, ленивый, нетерпеливый, никаких изменений
<?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(), то есть с конкретным загрузчиком, используемым в веб-старте.
С уважением,
Роберт