Java WebStart速度慢,从无效文件夹中请求库

问题和疑问:Java webstarted应用程序在基本文件夹而不是./lib中查找其类。

正如在Java Web Start应用程序中的类似问题中所建议的那样, 反复询问我已经关闭 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次重试,由web服务器回复404.最终,loadClass成功,但仅在10次或更多请求之后对于不存在的jar子。 将其与给定程序中正在访问的类的数量相乘,最终会导致初始化非常慢。 在这个简单的例子中,这个简单的类只有“重复”2次重试。

这一切都开始正常,jar装,一切都很好,很好:

 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文件,是的,我确实尝试了更新标签的所有变体,懒惰,渴望,没有变化

    WebStartSample user  WebStartSample WebStartSample           

我怀疑JNLPClassLoader()有问题,这是webstart中使用的特定加载器。

问候,

罗伯特

建议:

  1. 使用JaNeLAvalidationJNLP。 这似乎对我有用,但JaNeLA是更好的判断。
  2. 包括每个Jar的package元素。 JNLP文件语法的参考资料部分中提到了此元素(也在页面顶部的表中展开)。 将页面中的链接追溯到(仅可下载的)API规范,以获取package元素的更多详细信息。 另外,API规范。 是JWS上最好的资源。 我希望甲骨文能让它可以浏览网页。
  3. 索引Jar文件。
  4. 继续问这么好(经过深思熟虑,研究得很好,提出的很好)的问题。 🙂

谢谢大家的建议。 正是安德鲁暗示要“指出jar子”,它指出了正确的方向……

也就是说,jar子(我现在选择的IDE,Netbeans) 编入索引。 但是,主jar中的META-INF / INDEX.LIST包含对其他jar的引用,就好像它们位于主jar旁边的当前文件夹中一样。

 JarIndex-Version: 1.0 WebStartSample.jar webstartsample SampleJavaLibrary.jar newpackage 

这导致了jnlpClassLoader(),使用主索引,并在codebase url中查找jar,而它们实际上位于./lib url子文件夹下。

这是正确的索引(手动重新创建)的外观:

 JarIndex-Version: 1.0 WebStartSample.jar webstartsample lib/SampleJavaLibrary.jar newpackage 

为了使问题变得更糟,这样的webstarted应用程序不会失败,他们只会首先在错误的位置查找类/ jar,然后最终找到它们,可能已经加载了bu jnlp loader,如原始问题中所述。

简而言之,这与IS的Netbeans构建和打包程序有关。

我的立即修复是禁用jar索引,这导致正确和最小的网络流量,并大大改善了应用程序初始化。

要在Netbeans中执行此操作,请转到Tools-> Options-> Miscellaneous-> jar.index=false > Properties并添加jar.index=false

正确的解决方法是让Netbeans正确地对jar进行索引,但这是另一个问题。

再次感谢大家的建议。

PS。

  • janela util在我的jnlp中没有发现重大错误
  • 包元素包括没有变化
  • mydebian是指我的服务器,客户端是win7,包含所有最新和最好的java运行时和jdks,包括netbeans 6.9(也测试了7.0,产生了相同的问题索引)

“mydebian.mydomain”主机名暗示您在Debian上运行,其中OpenJDK是默认的Java实现。

Sun Java WebStart实现不是 OpenJDK的一部分,因此使用了替代实现。 由于Java WebStart没有官方TCK,因此需要手动找到OpenJDK实现中的细微差别甚至错误(因为没有官方的TCK)。

我建议尝试使用Sun JVM(例如在Windows上)并查看行为是否发生变化。