#java #jar #applet #jnlp #next-generation-plugin
#java #jar #апплет #jnlp #плагин следующего поколения
Вопрос:
У меня есть апплет, встроенный в 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 файл У меня есть правильный ИНДЕКСНЫЙ файл, сгенерированный 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 файл даже не загружается веб-браузером как первый (на самом деле он последний), поэтому ИНДЕКСНЫЙ файл не может быть правильно использован для проверки того, какие файлы следует загрузить.
Есть идеи, что я делаю не так?
// редактировать
Вывод из консоли 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:UserspkukielkaAppDataLocalLowSunJavaDeploymentcache6.0255cfa5999-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
Одно обновление:
Поскольку я запускаю этот пример на своем собственном веб-сервере, я запустил его с помощью debuger и просто пропустил обслуживающую библиотеку, которая должна загружаться лениво (я только что вернул пустой файл).
Затем я получил эту ошибку:
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)
Так что, похоже, что все отложенные загрузки просто игнорируются? Вопрос в том, почему?
Комментарии:
1. 1) Какие ресурсы находятся (предположительно)
external_3.jar
? 2) Как на них ссылаются? 3) Когда и с помощью чего на них ссылаются? 4) Почему 3 внешних Jar проиндексированы, но нетmainGUI.jar
? 5) Всеhref
атрибуты указывают на ресурсы, расположенные в корне сайта. Это там, где они находятся?2. Внешние банки 1 и 2 — это библиотека SwingX и библиотека JFreeChart, которые используются непосредственно в апплете для создания графического интерфейса. Внешняя jar 3 — это библиотека axis, используемая для выполнения некоторых запросов soap после нажатия пользователем кнопки. mainGUI не упоминается непосредственно в сборке ant, потому что $ (dist.jar ) является именно mainGUI.jar (так что это предмет сборки). Но все файлы из mainGUI.jar перечислены в индексном файле. Все файлы jar находятся в корневом каталоге, да.
3. «Внешняя jar 3 — это библиотека axis, используемая для выполнения некоторых запросов soap после того, как пользователь нажмет кнопку». Будьте более конкретны, какой фактический код используется в
actionPerformed
методе этой кнопки? Существует несколько способов вызвать lazy Jar для быстрой загрузки, я пытаюсь выяснить, сделали ли вы что-либо из этих многих вещей.4. Я понимаю, что вы имеете в виду, но это не может быть причиной. Код, который может вызывать что-либо из библиотеки axis, находится только в mainGUI.jar , и mainGUI.jar по какой-то причине загружается после axis.jar . Насколько я понимаю, этого не должно произойти, если mainGUI.jar помечена и «основная» банка.
5. Вы искали в базе данных ошибок? Возможно, это что-то новое.
Ответ №1:
Хорошо, я нашел ответ.
После просмотра 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
Ну, я был уверен, что мой кеш очищен, потому что на моей машине разработчика он полностью отключен. Просто для любопытства я снова включил его и попытался запустить свой апплет.
И теперь это работает.
Итак: БУДЬТЕ ОСТОРОЖНЫ, ОТЛОЖЕННАЯ ЗАГРУЗКА НЕ РАБОТАЕТ ПРИ ОТКЛЮЧЕННОМ КЭШЕ.
Комментарии:
1. У меня такая же проблема. Когда вы говорите «Кэш отключен», вы говорите о своем браузере или своей ОС? И если это ОС, как вы это измените?
2. Если вы используете Windows, посмотрите на эти инструкции: cyclic.ucsd.edu/javafiles.html
Ответ №2:
Возможно, вам не хватает атрибута codebase:
<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
Комментарии:
1. Я также пытался использовать codebase с точно таким же эффектом. Затем я где-то прочитал, что в случае апплета с jnlp кодовая база не нужна, потому что она всегда совпадает с местоположением вашего апплета.
2. Есть ли способ просмотреть какой-либо файл журналов ошибок из консоли Java браузера?