1

I have applet embedded in http page. Applet is signed (as all jars which I'm using) and it's using new java plugin which allows to embed applets in web page with jnlp. I wanted to lazy load one of the jar files required by my applet, but I cannot make it working.

This is my jnlp file:

<?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>

And html file:

<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>

Also in the mainGUI.jar file I have proper INDEX file generated by 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>

From what I see mainGUI.jar file is not even loaded as first one by web browser (actually it's last one), so INDEX file cannot be properly used to check what files should be downloaded.

Any idea what I'm doing wrong?

//edit

Output from java console:

Here you go:

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

One update: Since I'm running this example with my own web server I ran it with debuger and just skip serving library which should be loading lazily (I just returned empty file). Then I got this error:

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)

The line which seems very suspicious to me is:

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

So what, looks like all lazy downloads are just ignored? Question is why?

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Piotr Kukielka
  • 3,792
  • 3
  • 32
  • 40
  • 1) What resources are in (presumably) `external_3.jar`? 2) How are they referenced? 3) When and by what are they referenced? 4) Why are the 3 external Jars indexed, but not `mainGUI.jar`? 5) All the `href` attributes are pointing to resources located the root of the site. Is that where they are located? – Andrew Thompson Oct 28 '11 at 04:30
  • External jars 1 and 2 are SwingX library and JFreeChart library, both used directly in the applet to build the gui. External jar 3 is axis library used to make some soap requests after user will click the button. mainGUI is not referenced directly in the ant build because $(dist.jar) is exactly mainGUI.jar (so it's the subject of the build). But all files from mainGUI.jar are listed in the index file. All jar files are in the root directory, yes. – Piotr Kukielka Oct 28 '11 at 06:45
  • *"External jar 3 is axis library used to make some soap requests after user will click the button."* Be more specific, what is the actual code used in the `actionPerformed` method of that button? There are a number of ways to invoke a lazy Jar to be loaded eagerly, I'm trying to figure out if you have done any of those many things. – Andrew Thompson Oct 28 '11 at 06:50
  • I understand what you mean, but that cannot be a reason. Code which could be invoking anything from the axis library is only in mainGUI.jar, and mainGUI.jar for some reason is loaded after axis.jar. As far as I understand this shouldn't happen if mainGUI.jar is marked and 'main' jar. – Piotr Kukielka Oct 28 '11 at 07:01
  • Have you searched the bug DB? Perhaps this is a new one. – Andrew Thompson Oct 28 '11 at 08:29
  • Unlucky I didn't found anything like that. Also I seen few comments and examples over the internet where people claims that it works. I'm lost to be honest. – Piotr Kukielka Oct 28 '11 at 09:26

2 Answers2

2

Ok, I found the answer.

After looking at http://javasourcecode.org/html/open-source/jdk/jdk-6u23/com/sun/javaws/LaunchDownload.java.html I noticed this line:

  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

Well, I was sure my cache is cleared, because on my developer machine I have it disabled completely. Just for curious I enabled it again, and tried to run my applet.

And it works now.

So: BEWARE, LAZY LOADING DOESN'T WORK WITH CACHE DISABLED.

Piotr Kukielka
  • 3,792
  • 3
  • 32
  • 40
  • I'm having this same problem. When you say 'Cache Disabled' are you talking about your browser or your os? And if, it's the os, how do you change that? – haudenschilt May 03 '12 at 16:38
  • If you are using windows look at this instructions: http://cyclic.ucsd.edu/javafiles.html – Piotr Kukielka May 04 '12 at 19:37
0

You might be missing the codebase attribute:

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

Refer to here: http://download.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html

  • I was trying with codebase also, with exactly the same effect. Then I read somewhere that in case of applet with jnlp codebase is not needed because it's always the same as your applet location. – Piotr Kukielka Oct 27 '11 at 19:27
  • Is there a way to look into some kind of error logs file from the browser's Java console? –  Oct 28 '11 at 03:28