Java小程序的依赖性进账多次 [英] Java applet dependencies fetched multiple times

查看:195
本文介绍了Java小程序的依赖性进账多次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在调查嵌入功能的Web应用程序<小程序> ,其中有几个依赖(.jar文件)。

小程序标记看起来像:

 <小程序...
        类型=应用程序/ x-j​​ava的小程序
        codeBase类=/ web应用/小应用程序>
     ...
     < PARAM NAME =codeBase的VALUE =./小程序/>
     < PARAM NAME =档案值=a.jar文件,b.jar,c.jar/>
     < PARAM NAME =codebase_lookupVALUE =FALSE/>
< /小程序>

Applet的工作确定,但问题是,当它加载的首次,这些a.jar文件,b.jar,c.jar等正在要求(和下载)从Web服务器的很多(20-300)次,每个,这使得小程序启动非常缓慢。

怎么回事,是罐子被重新下载的每一个加载的类分开?

有没有办法正确地优化/配置小程序?试了缓存技巧(如< PARAM NAME =cache_archive/> ,但没有成功,甚至不知道它是解决这个问题的正确方法。

NB!这个小程序的 WS客户端(具有一定的 JAXB -annotated类和相关的依赖)。


在启动小程序日志有足够的那些:

 网​​络:连接http://127.0.0.1:7001/webapp/applet/a.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/a.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/a.jar与代理= DIRECT
...〜100次以上a.jar文件下载
网络:连接http://127.0.0.1:7001/webapp/applet/a.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/b.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/b.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/c.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/a.jar与代理= DIRECT
网络:连接http://127.0.0.1:7001/webapp/applet/c.jar与代理= DIRECT
...

Web服务器访问日志反映小应用程序日志:

  127.0.0.1  - GET /webapp/applet/a.jar HTTP / 1.1200 1232582
127.0.0.1 - GET /webapp/applet/a.jar HTTP / 1.1200 1232582
127.0.0.1 - GET /webapp/applet/a.jar HTTP / 1.1200 1232582
...
127.0.0.1 - GET /webapp/applet/a.jar HTTP / 1.1200 1232582


解决方案

这是因为在发生 CXF URL.openStream()使用从罐子(模式,WSDL文件等)访问不同的资源。

问题是通过更换得到解决 URL.openStream()的getResourceAsStream()类加载器的方法(显然 Applet2ClassLoader.getResource()的OpenStream()使得不必要的连接和 Applet2ClassLoader.getResourceAsStream()并不是)。

更新:它似乎是工作java7目录插件,但不是的Java6有一个

Web application I'm currently investigating embeds <applet>, which has several dependencies (.jar files).

Applet tag looks like that:

<applet ...
        type="application/x-java-applet"
        codebase="/webapp/applet">
     ...
     <param name="codebase" value="./applet"/>
     <param name="archive" value="a.jar,b.jar,c.jar"/>
     <param name="codebase_lookup" value="false"/>
</applet>

Applet works OK, but the problem is, that when it loads for the first time, those a.jar, b.jar, c.jar, etc. are being requested (and downloaded) from web server MANY (20-300) times, each, which makes applet start-up quite slow.

Whats going on, are jars being re-downloaded for each loaded class separately?

Is there a way to optimize/configure applet properly? Tried several caching tricks (like <param name="cache_archive" /> , but no success and not even sure it's right way to approach this problem.

NB! this applet is WS client (has some JAXB-annotated classes and related dependencies).


Applet log on start-up has plenty of those:

network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
... ~100 more times a.jar is downloaded
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/b.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/b.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/c.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/c.jar with proxy=DIRECT
...

Web server access log reflects applet log:

127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582 
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582 
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582 
...
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582 

解决方案

This was happening because in CXF URL.openStream() was used to access different resources from jars (schemas, wsdls, etc).

Issue was solved by replacing URL.openStream() with getResourceAsStream() method from classloader (apparently Applet2ClassLoader.getResource().openStream() makes unnecessary connection and Applet2ClassLoader.getResourceAsStream() does not).

Update: it seems to be working on Java7 Plugin, but not Java6 one.

这篇关于Java小程序的依赖性进账多次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆