В чем может быть причина того, что в апплете с файлом jnlp не работает ленивая загрузка jar?

У меня есть апплет, встроенный в http-страницу. Апплет подписан (как и все банки, которые я использую), и он использует новый плагин java, который позволяет вставлять апплеты на веб-страницу с помощью jnlp. Я хотел лениво загрузить один из jar-файлов, необходимых для моего апплета, но не могу заставить его работать.

Это мой файл jnlp:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" href="/GUI.jnlp">
    <information>
        <title>My Applet</title>
        <vendor>My Company</vendor>
    </information>
    <resources>
        <j2se href="http://java.sun.com/products/autodl/j2se" version="1.6+"/>   
        <jar href="/mainGUI.jar" main="true"/>
        <jar href="/external_1.jar"/>
        <jar href="/external_2.jar"/>
        <jar href="/external_3.jar" download="lazy"/>
    </resources>
    <applet-desc
         name="My Applet"
         main-class="com.xformation.GUIAppletMain"
         width="800"
         height="600">
    </applet-desc>
</jnlp>

И файл html:

<APPLET width="100%" height="100%" name="My App" code="CompatibilityApplet" archive="mainGUI.jar">
    <param name="jnlp_href" value="GUI.jnlp">
    <script type="text/javascript">
        <!--
            document.write('<param name="server_address" value="' + window.location.href + '">');
        //-->
    </script>
</APPLET>

Также в файле mainGUI.jar у меня есть соответствующий файл INDEX, созданный ant:

<target name="-do-jar-with-manifest" depends="compile">
    <jar destfile="${dist.jar}"  basedir="${build.classes.dir}" index="true">
        <indexjars>
            <fileset dir="libs">
                <include name="**/external_1.jar"/>
                <include name="**/external_2.jar"/>
                <include name="**/external_3.jar"/>
            </fileset>
        </indexjars>
    </jar>
</target>

Из того, что я вижу, файл mainGUI.jar даже не загружается веб-браузером как первый (на самом деле он последний), поэтому файл INDEX не может использоваться должным образом для проверки того, какие файлы должны быть загружены.

Есть идеи, что я делаю не так?

//редактировать

Вывод из консоли java:

Ну вот:

security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws
security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy
security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.definition value null
security: property package.definition new value com.sun.javaws
security: property package.definition value com.sun.javaws
security: property package.definition new value com.sun.javaws,com.sun.deploy
security: property package.definition value com.sun.javaws,com.sun.deploy
security: property package.definition new value com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy,com.sun.jnlp,org.mozilla.jss
security: property package.definition value com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.definition new value com.sun.javaws,com.sun.deploy,com.sun.jnlp,org.mozilla.jss
network: Created version ID: 1.6.0.26
network: Created version ID: 1.6
network: Created version ID: 1.6.0.26
network: Created version ID: 1.6
network: Created version ID: 1.6.0.26
network: Created version ID: 1.6
network: Created version ID: 1.6.0.26
network: Created version ID: 1.6
network: Connecting http://192.168.22.124:6500/mainGUI.jnlp with proxy=DIRECT
network: Connecting http://192.168.22.124:6500/ with proxy=DIRECT
network: ResponseCode for http://192.168.22.124:6500/mainGUI.jnlp : 200
network: Encoding for http://192.168.22.124:6500/mainGUI.jnlp : null
network: Sever response: (length: 703, lastModified: Thu Oct 27 13:12:43 CEST 2011, downloadVersion: null, mimeType: text/plain)
network: Downloading resource: http://192.168.22.124:6500/mainGUI.jnlp
    Content-Length: 703
    Content-Encoding: null
network: Wrote URL http://192.168.22.124:6500/mainGUI.jnlp to File C:\Users\pkukielka\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\25\5cfa5999-21379497-temp
network: Disconnect connection to http://192.168.22.124:6500/mainGUI.jnlp
temp: new XMLParser with source:
temp: <?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" href="/mainGUI.jnlp">
    <information>
        <title>xxx</title>
        <vendor>xxx</vendor>
    </information>
    <resources>
        <j2se href="http://java.sun.com/products/autodl/j2se" version="1.6+"/>   
        <jar href="/swingx-core-1.6.2.jar"/>
        <jar href="/jfreechart-1.0.13.jar"/>
        <jar href="/axis.jar" download="lazy"/>
        <jar href="/mainGUI.jar" download="eager" main="true"/>
    </resources>
    <applet-desc
         name="LM-X Manager Applet"
         main-class="com.company.mainGUIApplet"
         width="800"
         height="600">
    </applet-desc>
</jnlp>

temp: 

returning ROOT as follows:

<jnlp spec="1.0+" href="/mainGUI.jnlp">
  <information>
    <title>xxx</title>
    <vendor>xxx</vendor>
  </information>
  <resources>
    <j2se href="http://java.sun.com/products/autodl/j2se" version="1.6+"/>
    <jar href="/swingx-core-1.6.2.jar"/>
    <jar href="/jfreechart-1.0.13.jar"/>
    <jar href="/axis.jar" download="lazy"/>
    <jar href="/mainGUI.jar" download="eager" main="true"/>
  </resources>
  <applet-desc name="xxx" main-class="com.company.mainGUIApplet" width="800" height="600"/>
</jnlp>jnlp
temp: returning LaunchDesc from XMLFormat.parse():

<jnlp spec="1.0+" codebase="http://192.168.22.124:6500/" href="http://192.168.22.124:6500/mainGUI.jnlp">
  <information>
    <title>xxx</title>
    <vendor>xxx</vendor>
    <homepage href="null"/>
  </information>
  <update check="timeout" policy="always"/>
  <resources>
    <java href="http://java.sun.com/products/autodl/j2se" version="1.6+"/>
    <jar href="http://192.168.22.124:6500/swingx-core-1.6.2.jar" download="eager" main="false"/>
    <jar href="http://192.168.22.124:6500/jfreechart-1.0.13.jar" download="eager" main="false"/>
    <jar href="http://192.168.22.124:6500/axis.jar" download="lazy" main="false"/>
    <jar href="http://192.168.22.124:6500/mainGUI.jar" download="eager" main="true"/>
  </resources>
  <applet-desc name="xxx" main-class="com.company.mainGUIApplet" documentbase="http://192.168.22.124:6500/" width="800" height="600"/>
</jnlp>
basic: Plugin2ClassLoader.addURL2 called for http://192.168.22.124:6500/mainGUI.jar
basic: Plugin2ClassLoader.addURL2 called for http://192.168.22.124:6500/swingx-core-1.6.2.jar
basic: Plugin2ClassLoader.addURL2 called for http://192.168.22.124:6500/jfreechart-1.0.13.jar
basic: Plugin2ClassLoader.addURL2 called for http://192.168.22.124:6500/axis.jar
basic: Plugin2ClassLoader.drainPendingURLs addURL called for http://192.168.22.124:6500/mainGUI.jar
basic: Plugin2ClassLoader.drainPendingURLs addURL called for http://192.168.22.124:6500/swingx-core-1.6.2.jar
basic: Plugin2ClassLoader.drainPendingURLs addURL called for http://192.168.22.124:6500/jfreechart-1.0.13.jar
basic: Plugin2ClassLoader.drainPendingURLs addURL called for http://192.168.22.124:6500/axis.jar
network: No Custom Progress jar
network: Connecting http://192.168.22.124:6500/axis.jar with proxy=DIRECT
network: Downloading resource: http://192.168.22.124:6500/axis.jar
    Content-Length: 1 972 163
    Content-Encoding: null
security: Blacklist revocation check is enabled
network: LaunchDownload: concurrent downloads from LD: 4
network: Total size to download: -1
network: Connecting http://192.168.22.124:6500/jfreechart-1.0.13.jar with proxy=DIRECT
network: Connecting http://192.168.22.124:6500/swingx-core-1.6.2.jar with proxy=DIRECT
network: Connecting http://192.168.22.124:6500/mainGUI.jar with proxy=DIRECT
network: Connecting http://192.168.22.124:6500/ with proxy=DIRECT
network: Connecting http://192.168.22.124:6500/ with proxy=DIRECT
network: Downloading resource: http://192.168.22.124:6500/jfreechart-1.0.13.jar
    Content-Length: 1 479 993
    Content-Encoding: null
network: Validating http://192.168.22.124:6500/jfreechart-1.0.13.jar , version null...
network: Downloaded http://192.168.22.124:6500/jfreechart-1.0.13.jar: null
network: Download Progress: jarsDone: 1
network: Downloading resource: http://192.168.22.124:6500/mainGUI.jar
    Content-Length: 881 140
    Content-Encoding: null
network: Validating http://192.168.22.124:6500/mainGUI.jar , version null...
network: Downloaded http://192.168.22.124:6500/mainGUI.jar: null
network: Download Progress: jarsDone: 2
network: Downloading resource: http://192.168.22.124:6500/swingx-core-1.6.2.jar
    Content-Length: 1 569 320
    Content-Encoding: null
network: Validating http://192.168.22.124:6500/swingx-core-1.6.2.jar , version null...
network: Downloaded http://192.168.22.124:6500/swingx-core-1.6.2.jar: null
network: Download Progress: jarsDone: 3
network: Created version ID: 1.6+
network: Created version ID: 1.6.0.26
network: Created version ID: 1.6.0.26
network: Created version ID: 1.6
basic: LaunchDesc location: http://192.168.22.124:6500/mainGUI.jnlp
network: Created version ID: 1.0+
network: Created version ID: 6.0.18
basic: passing security checks; secureArgs:true, allSigned:false
basic: continuing launch in this VM
(...) <- here 500 lines with loaded classses listed, nothing form axis library

Одно обновление: поскольку я запускаю этот пример со своим собственным веб-сервером, я запускал его с помощью отладчика и просто пропустил обслуживающую библиотеку, которая должна загружаться лениво (я только что вернул пустой файл). Потом я получил такую ​​ошибку:

java.io.FileNotFoundException: http://192.168.22.124:6500/axis.jar?version-id=1.0
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getJarFileWithoutCache(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getJarFileWithoutCache(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCachedJarFile(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCachedJarFile(Unknown Source)
at com.sun.javaws.LaunchDownload.downloadEagerorAll(Unknown Source)
at sun.plugin2.applet.JNLP2Manager.downloadResources(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)

Строка, которая мне кажется очень подозрительной:

at com.sun.javaws.LaunchDownload.downloadEagerorAll(Unknown Source)

Так что, похоже, все ленивые загрузки просто игнорируются? Вопрос в том, почему?


person Piotr Kukielka    schedule 27.10.2011    source источник
comment
1) Какие ресурсы есть в (предположительно) external_3.jar? 2) Как на них ссылаются? 3) Когда и чем они упоминаются? 4) Почему 3 внешних Jar-файла проиндексированы, но не mainGUI.jar? 5) Все атрибуты href указывают на ресурсы, расположенные в корне сайта. Это где они расположены?   -  person Andrew Thompson    schedule 28.10.2011
comment
Внешние jar-файлы 1 и 2 - это библиотека SwingX и библиотека JFreeChart, которые используются непосредственно в апплете для создания графического интерфейса. Внешняя банка 3 - это осевая библиотека, используемая для выполнения некоторых запросов на мыло после того, как пользователь нажмет кнопку. mainGUI не упоминается напрямую в сборке ant, потому что $ (dist.jar) - это в точности mainGUI.jar (поэтому он является предметом сборки). Но все файлы из mainGUI.jar перечислены в индексном файле. Все файлы jar находятся в корневом каталоге, да.   -  person Piotr Kukielka    schedule 28.10.2011
comment
Внешний jar 3 - это осевая библиотека, используемая для выполнения некоторых запросов мыла после того, как пользователь нажмет кнопку. Если быть более конкретным, какой фактический код используется в actionPerformed методе этой кнопки? Есть несколько способов вызвать ленивый Jar для быстрой загрузки, я пытаюсь выяснить, сделали ли вы что-нибудь из этого.   -  person Andrew Thompson    schedule 28.10.2011
comment
Я понимаю, что вы имеете в виду, но это не может быть причиной. Код, который может вызывать что-либо из библиотеки оси, находится только в mainGUI.jar, а mainGUI.jar по какой-то причине загружается после axis.jar. Насколько я понимаю, этого не должно происходить, если mainGUI.jar отмечен как main jar.   -  person Piotr Kukielka    schedule 28.10.2011
comment
Вы искали в базе данных ошибок? Возможно, это новый.   -  person Andrew Thompson    schedule 28.10.2011
comment
К несчастью, ничего подобного не нашла. Также я видел несколько комментариев и примеров в Интернете, где люди утверждали, что это работает. Я потерялся, если честно.   -  person Piotr Kukielka    schedule 28.10.2011


Ответы (2)


Хорошо, я нашел ответ.

Посмотрев на http://javasourcecode.org/html/open-source/jdk/jdk-6u23/com/sun/javaws/LaunchDownload.java.html Я заметил эту строку:

  868   // We will eagerly download all lazy resources that have already been cached too.
  869   // Otherwise, we might not detect that an update have happend

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

И теперь это работает.

Итак: ОСТОРОЖНО, ленивая загрузка НЕ ​​РАБОТАЕТ ПРИ ОТКЛЮЧЕННОМ КЭШЕ.

person Piotr Kukielka    schedule 02.11.2011
comment
У меня такая же проблема. Когда вы говорите «Кэш отключен», вы имеете в виду свой браузер или свою операционную систему? А если это ОС, как это изменить? - person haudenschilt; 03.05.2012
comment
Если вы используете Windows, ознакомьтесь с этими инструкциями: cyclic.ucsd.edu/javafiles.html - person Piotr Kukielka; 04.05.2012

Возможно, вам не хватает атрибута кодовой базы:

<jnlp
  spec="6.0+"
  codebase="http://my_company.com/jaws/apps"
  href="swingset2.jnlp">

См. Здесь: http://download.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html.

person Community    schedule 27.10.2011
comment
Я также пробовал с кодовой базой, с точно таким же эффектом. Затем я где-то читал, что в случае апплета с кодовой базой jnlp не требуется, потому что он всегда совпадает с местоположением вашего апплета. - person Piotr Kukielka; 27.10.2011
comment
Есть ли способ просмотреть какой-то файл журнала ошибок из консоли Java браузера? - person ; 28.10.2011